2016-03-17 15 views
12

次のコードからinput_shapeエラーが発生し続けます。Keras LSTM RNN input_shapeエラーが表示されるのはなぜですか?

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 

上記のすべてが円滑に実行されます。これが間違っているところです。

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) 

このエラーが返されます。

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

それはタプルを指定すると言うthe websiteチェック「(例えば(100)100次元の入力のために)。」

私のデータセットは10320の長さの1つの列で構成されています。つまり、をinput_shapeとして入れておく必要があると思いますが、エラーが発生します。誰にも解決策がありますか?

+0

運を以下に示しますか? – Radix

+0

いいえ。それは悲劇です。私はこのためにカウンセリングに行く必要があった。私は壊した。 – NickTheInventor

+0

これは、手動でエポック(コードの最後の部分)を実行する必要があるようです:https://github.com/fchollet/keras/blob/master/examples/stateful_lstm.py – Radix

答えて

0

入力シェイプを指定せずにLSTMレイヤーを使用するようにしてください。ケラスはあなたのために仕事をしましょう。あなたも同様の問題を抱えているので、マスキングについてもコメントしたと思います。私は前にそれに直面し、それはinput_shape =(time_steps、input_dim)が分かります。私はこれがKerasの新しい自動形状推定のために起こると思います。

4

私の理解では、入力と出力の両方が1次元ベクトルです。トリックは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) 
ここ

あるキーポイント:あなたが最初のレイヤを追加するとき、あなたは隠れノードの数を指定する必要があり

  • 、そしてあなたの入力形状。彼らはあなたの出力層のために、
  • 同様に、前の層の隠れノードからそれを推測することができますよう後件層はこのことができますあなたがだけ

希望出力ノードの数を指定する入力形状を必要としません。 。

1

さらに詳しい情報:可変長のシーケンスでRNN(LSTMなど)を使用する場合、データのフォーマットを取る必要があります。

シーケンスをグループ化してフィットメソッドに渡す場合、kerasはサンプルの行列を作成しようとします。これはすべての入力シーケンスが同じサイズでなければならないことを意味します。そうでなければ、正しい寸法。

あり、いくつかの可能な解決策:彼らはサイズによって同じサイズに

  • グループ系列を持っているので、

    1. は(パッド
    2. (例えばfit_generatorを使用して)、サンプル一つ一つを使用して、すべてのシーケンスを、ネットワークを訓練します最終的にはそれらを埋める)とグループ別にネットワークグループを訓練する(再びジェネレータベースの適合を使用)

    第3の解決策は、vaライバルサイズ。また、シーケンスをパッドする場合(2番目または3番目のソリューション)、マスキングレイヤーを入力として追加することができます。あなたがわからない場合

    、あなたのデータの形状を印刷しようと

    あなたが見てする必要があるかもしれません(numpyの配列の形状属性を使用。):https://keras.io/preprocessing/sequence/(pad_sequences)とhttps://keras.io/layers/core/#masking

  • 0

    Keras 2.0.0との作業バージョンは、基数のコード修正、これで

    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) 
    
    関連する問題