2016-09-19 10 views
1

ケラスtrain_on_batchとnnを訓練しようとしています。 39個の機能があり、32個のサンプルを含むバッチが必要です。だから私はトレーニングの繰り返しごとに32個のnumpyの配列を持っています。だからここトレーニングのための機能のケラス形

は私のコード(ここでは、すべてのbatch_xは32 numpyの配列39個の機能を含む各リストである)である:

input_shape = (39,) 

model = Sequential() 
model.add(Dense(39, input_shape=input_shape)) # show you is only first layer 
... 

for batch_x, batch_y in train_gen: 
    model.train_on_batch(batch_x, batch_y) 

しかし、突然、私はエラーを得た:

Exception: Error when checking model input: the list of Numpy arrays 
that you are passing to your model is not the size the model expected. 
Expected to see 1 arrays but instead got the following list of 32 arrays: 

アイム何が間違っているのか分かりません。

P.S.私はまた、(32,39)、(39,32)などの異なるinput_shapeを試しました。

答えて

4

サイズが32の配列は必要ありません。サイズの配列(32,39)が1つ必要です。

input_shapeを(None、39)に変更する必要があります.Nothingは、batch_sizeを動的に変更し、batch_xを形状の数が少ない配列(32,39)に変更できます。

1

ケラスでは、出力ではなく、入力ディメンションが最初のargです。 Keras docsフロントページの例はかなり明確です:

私はあなたの要求があると思うものと一致している例を調整
model.add(Dense(output_dim=64, input_dim=100)) 

:あなたのコードで

model.add(Dense(output_dim=39, input_dim=39)) 

、あなたのDense層の最初の位置argが39ですこれはおそらく想定しているように、の出力を入力ではなく39-Dに設定します。あなたは39の入力機能を持っていると言った。その最初のレイヤー(あなたが意図していたものを複製しようとしています)は、39次元の入力フィーチャーベクターから圧縮やフィーチャー抽出を行いません。

各レイヤーの入力配列と出力配列のディメンションを(例のように)設定し、input_ の形状をそのままのままにするのはなぜですか?あなたの入力(およびラベル)をデフォルトの前提条件に合うように変更しますか?また、入力データセット(またはその一部)に対して基本的なfitメソッドを実行してから、手作業でバッチを実行するなど、より複雑な構成に移行することもできます。

from keras.models import Sequential 
from keras.layers import Dense, Activation 
from keras.regularizers import l1l2 

X = np.random.randn(1000, 39) 
y = np.array([X[i,7:13].sum() for i in range(X.shape[0])]) 

nn = Sequential() 
nn.add(Dense(output_dim=1, input_dim=39)) 
nn.compile('sgd', 'mse') 
nn.fit(X, y, nb_epoch=10) 

います:

Epoch 1/10 
1000/1000 [==============================] - 0s - loss: 4.6266  
...  
Epoch 10/10 
1000/1000 [==============================] - 0s - loss: 1.4048e-04 
ここ

は、あなたの特徴次元とおもちゃの問題の一例です
関連する問題