私はKerasで単純なモデルを試しています。これをサイズ5x3の行列として入力したいと思います。以下の例では、これは、最初の高密度レイヤーを追加するときにinput_shape=(5, 3)
を使用して指定されます。
_from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import Adam
import numpy as np
model = Sequential()
model.add(Dense(32, input_shape=(5, 3)))
model.add(Activation('relu'))
model.add(Dense(32))
model.add(Activation('relu'))
model.add(Dense(4))
adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=adam)
x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15]])
y = model.predict(x)
_
ただし、コードを実行すると、model.predict()
関数で次のエラーが発生します。
ValueError:チェック時のエラー:稠密入力1は3次元であると期待されていましたが、形状(5、3)の配列を取得しました
しかし、私はエラーを理解していません。 x
の形状は(5、3)であり、これはまさに最初の密な層が入力として期待するように私が言ったことです。なぜそれが3次元を期待しているのですか?これはバッチサイズと関係があるようですが、_input_shape
_はネットワークの形状を参照しているだけで、バッチサイズとは関係がないと思いました...
問題はここにあります:
_model.add(Dense(32, input_shape=(5, 3)))
_
そのはず:
_model.add(Dense(32, input_shape=(3,)))
_
この最初の例ディメンションは_input_shape
_に含まれていません。また、ネットワークフィッティング中に設定された_batch_size
_に実際に依存しているためです。あなたが指定したいなら、あなたは試すことができます:
_model.add(Dense(32, batch_input_shape=(5, 3)))
_
編集:
あなたのコメントから、私はあなたがあなたの入力にshape=(5,3)
を持たせたいことを理解しました。この場合、あなたは次のことをする必要があります:
reshape
あなたのx
設定:
_x = x.reshape((1, 5, 3))
_
ここで、最初の次元は例から来ています。
ある段階でモデルをflatten
する必要があります。これがないと、_2d
_入力がネットワークを介して渡されるためです。次のことを行うことをお勧めします。
_model = Sequential()
model.add(Dense(32, input_shape=(5, 3)))
model.add(Activation('relu'))
model.add(Dense(32))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(4))
_
Sequential APIのadd()メソッドを使用してKerasレイヤーを追加する場合、パラメーターinput_shapeは、batch_sizeに関係なく、入力データの形状のみを考慮します。したがって、あなたのケースでは、引数input_shape =(5、3)を指定することで、モデルに(5、3)の入力形状が必要であることを正しく記述します。
ただし、バッチサイズを1に選択した場合でも、Kerasは常にバッチで入力データを提供することを期待しています。これは、3にするために入力に追加のディメンションを追加する必要があることを意味します。最初の次元がbatch_sizeである次元。これは次のようにして行うことができます:
x = x [なし、:、:]
これで問題は解決すると思います