web-dev-qa-db-ja.com

Keras:3次元が期待されますが、形状のある配列を取得しました-高密度モデル

TfidfVectorizerを使用してベクトル化された単語に基づいて、マルチラベル分類(20の異なる出力ラベル)を行いたい。各行に2739個のアイテム(ゼロまたは1)を含む39974行のセットがあります。

1つの隠しレイヤー(activation = 'relu'で最大20個のノード)を含むKerasモデルを使用してこのデータを分類し、20の可能な出力値に等しい出力レイヤー(activation = 'softmax'で最適に選択)を分類します。

これまでの私のコードは次のとおりです。

model = Sequential()
model.add(Dense(units=20, activation='relu', input_shape=tfidf_matrix.shape))
model.add(Dense(units=20, activation='softmax'))
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(tfidf_matrix, train_data['cuisine_id'], epochs=10)

しかし、エラーが発生しました:

ValueError:入力のチェック中にエラーが発生しました:dense_1_inputは3次元であることが期待されますが、形状の配列を取得しました(39774、2739)

このNNをこのマトリックスを使用して適合するように指定するにはどうすればよいですか?

8
ldragicevic

行数(トレーニングサンプル数)は、ネットワークの入力形状の一部ではありません。これは、トレーニングプロセスがネットワークにバッチごとに1つのサンプル(より正確には、バッチごとにbatch_sizeサンプル)を供給するためです。

あなたの場合、ネットワークの入力形状は(2739, )および正しいコードは次のようになります。

model = Sequential()
# the shape of one training example is
input_shape = tfidf_matrix[0].shape
model.add(Dense(units=20, activation='relu', input_shape=input_shape))
model.add(Dense(units=20, activation='softmax'))
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', 
metrics=['accuracy'])
model.fit(tfidf_matrix, train_data['cuisine_id'], epochs=10)
6
Denis Zubo