Por que recebo um erro de input_shape Keras LSTM RNN?

votos
13

Recebo um erro input_shape de código a seguir.

from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM

def _load_data(data):
    
    data should be pd.DataFrame()
    
    n_prev = 10
    docX, docY = [], []
    for i in range(len(data)-n_prev):
        docX.append(data.iloc[i:i+n_prev].as_matrix())
        docY.append(data.iloc[i+n_prev].as_matrix())
    if not docX:
        pass
    else:
        alsX = np.array(docX)
        alsY = np.array(docY)
        return alsX, alsY

X, y = _load_data(dframe)
poi = int(len(X) * .8)
X_train = X[:poi]
X_test = X[poi:]
y_train = y[:poi]
y_test = y[poi:]

input_dim = 3

Todos os itens acima é executado sem problemas. Este é onde ele vai mal.

in_out_neurons = 2
hidden_neurons = 300
model = Sequential()
#model.add(Masking(mask_value=0, input_shape=(input_dim,)))
model.add(LSTM(in_out_neurons, hidden_neurons, return_sequences=False, input_shape=(len(full_data),)))
model.add(Dense(hidden_neurons, in_out_neurons))
model.add(Activation(linear))
model.compile(loss=mean_squared_error, optimizer=rmsprop)
model.fit(X_train, y_train, nb_epoch=10, validation_split=0.05)

Ele retorna este erro.

Exception: Invalid input shape - Layer expects input ndim=3, was provided with input shape (None, 10320)

Quando eu verificar o site diz para especificar uma tupla (por exemplo (100), para entradas de 100-dimensionais).

Dito isto, o meu conjunto de dados consiste em uma coluna com um comprimento de 10320. Presumo que isso significa que eu deveria estar colocando (10320,)em como o input_shape, mas eu recebo o erro de qualquer maneira. Alguém tem uma solução?

Publicado 17/03/2016 em 16:50
fonte usuário
Em outras línguas...                            


4 respostas

votos
0

Tentar usar a camada LSTM sem especificar a forma de entrada. Vamos Keras fazer o trabalho para você. Eu acho que você comentou o mascaramento, mas também porque o seu problema semelhante recebendo. Eu enfrentei antes e verifica-se a input_shape = (time_steps, input_dim). Eu acho que isso acontece devido à nova inferência forma automática em Keras.

Respondeu 28/03/2016 em 22:48
fonte usuário

votos
4

Meu entendimento é que tanto a sua entrada e sua saída é um vetores dimensionais. O truque é para reformular-los por exigências Keras:

from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM
import numpy as np

X= np.random.rand(1000)
y = 2*X

poi = int(len(X) * .8)
X_train = X[:poi]
y_train = y[:poi]

X_test = X[poi:]
y_test = y[poi:]

# you have to change your input shape (nb_samples, timesteps, input_dim)
X_train = X_train.reshape(len(X_train), 1, 1)
# and also the output shape (note that the output *shape* is 2 dimensional)
y_train = y_train.reshape(len(y_train), 1)


#in_out_neurons = 2 
in_out_neurons = 1

hidden_neurons = 300
model = Sequential()
#model.add(Masking(mask_value=0, input_shape=(input_dim,)))
model.add(LSTM(hidden_neurons, return_sequences=False, batch_input_shape=X_train.shape))
# only specify the output dimension
model.add(Dense(in_out_neurons))
model.add(Activation("linear"))
model.compile(loss="mean_squared_error", optimizer="rmsprop")
model.fit(X_train, y_train, nb_epoch=10, validation_split=0.05)

# calculate test set MSE
preds = model.predict(X_test).reshape(len(y_test))
MSE = np.mean((preds-y_test)**2)

Aqui estão os pontos-chave:

  • quando você adiciona sua primeira camada, que são obrigados a especificar o número de nós escondidos, e sua forma de entrada. camadas consequentes não requerem a forma de entrada uma vez que pode-se inferir que a partir dos nós escondidos da camada anterior
  • Da mesma forma, para sua camada de saída você única especificar o número de nós de saída

Espero que isto ajude.

Respondeu 28/06/2016 em 18:09
fonte usuário

votos
1

Alguns mais informações: ao usar RNN (como LSTM) com sequências de comprimento variável, você tem que tomar do formato de seus dados.

Quando você seqüências de grupo a fim de passá-lo para o método de ajuste, keras vai tentar construir uma matriz de amostras, o que implica que todas as seqüências de entrada devem ter o mesmo tamanho, caso contrário você não terá uma matriz da dimensão correta.

Há várias soluções possíveis:

  1. treinar sua rede utilizando amostras de um por um (usando fit_generator por exemplo)
  2. almofada todas as suas seqüências para que eles tenham o mesmo tamanho
  3. seqüências de grupos por tamanho (eventualmente, preenchimento-los) e treinar o seu grupo de rede por grupo (novamente usando ajuste baseado gerador)

A terceira solução corresponde à estratégia mais comum com tamanho variável. E se você seqüências de almofada (segunda ou terceira solução) você pode querer adicionar uma camada de máscara como entrada.

Se você não tiver certeza, tente imprimir a forma de seus dados (usando o atributo forma da matriz numpy.)

Você pode precisar de olhar para: https://keras.io/preprocessing/sequence/ (pad_sequences) e https://keras.io/layers/core/#masking

Respondeu 29/03/2017 em 08:33
fonte usuário

votos
1

A seguir é a versão de trabalho com Keras 2.0.0 , Modificado código do radix

from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM
import numpy as np

X= np.random.rand(1000)
y = 2 * X

poi = int(len(X) * .8)
X_train = X[:poi]
y_train = y[:poi]

X_test = X[poi:]
y_test = y[poi:]

# you have to change your input shape (nb_samples, timesteps, input_dim)
X_train = X_train.reshape(len(X_train), 1, 1)
# and also the output shape (note that the output *shape* is 2 dimensional)
y_train = y_train.reshape(len(y_train), 1)

# Change test data's dimension also.
X_test = X_test.reshape(len(X_test),1,1)
y_test = y_test.reshape(len(y_test),1)


#in_out_neurons = 2
in_out_neurons = 1

hidden_neurons = 300
model = Sequential()
# model.add(Masking(mask_value=0, input_shape=(input_dim,)))
# Remove batch_input_shape and add input_shape = (1,1) - Imp change for Keras 2.0.0
model.add(LSTM(hidden_neurons, return_sequences=False, input_shape=(X_train.shape[1],X_train.shape[2])))
# only specify the output dimension
model.add(Dense(in_out_neurons))
model.add(Activation("linear"))
model.compile(loss="mean_squared_error", optimizer="rmsprop")
model.summary()
model.fit(X_train, y_train, epochs=10, validation_split=0.05)

# calculate test set MSE
preds = model.predict(X_test).reshape(len(y_test))
print(preds)
MSE = np.mean((preds-y_test)**2)
print('MSE ', MSE)
Respondeu 16/04/2017 em 06:15
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more