tensorflow2.0-ValueError:A target array with shape was passed for an output of shape...問題解決

5919 ワード

Jupyter notebookでマルチカテゴリモデルを訓練中にエラーが発生しました
質問:もしもしfashion_mnistデータセット、トレーニングとテストの画像はすべて正規化され、ラベルも独熱符号化に変わりました.
モデル作成のコードは次のとおりです.
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape = (28, 28)))
model.add(tf.keras.layers.Dense(128, activation = 'relu'))
model.add(tf.keras.layers.Dense(10, activation = 'softmax'))

前に実行したときは間違いなく報告していましたが、後でレイヤを追加して、ネットワークフィット能力が向上したかどうかを試してみるつもりで、上のコードの下に簡単に乱暴に行を追加しました.
model.add(tf.keras.layers.Dense(128, activation = 'relu'))

その後モデルアセンブリを行い,損失関数を分類クロスエントロピーとして指定する.
model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate = 0.01),
              loss = 'categorical_crossentropy',
              metrics = ['acc'])

データを入力してトレーニングを行うと、エラーが発生します.
model.fit(train_image, train_label_onehot, epochs = 5)

エラーは次のとおりです.
...
ValueError: A target array with shape (60000, 10) was passed for an output of shape (None, 128)
while using as loss `categorical_crossentropy`. 
This loss expects targets to have the same shape as the output.

原因:ネットワーク層を追加する際に出力ニューロンの個数を変更しなかった.ラベルを独熱符号化後のlabelに変換する.shapeは(60000,)から(60000,10)になるので対応する出力は10ニューロンであるべきである
解決:128から10に変更
model.add(tf.keras.layers.Dense(10, activation = 'relu'))

まとめ:実際にはこのように直接ネットワーク層を修正するべきではなく、softmax層は最後の層に置くべきである.
ネットワーク構造を修正する際には出力ニューロンの修正に注意し,第2層から入力ニューロンは機械によって自動的に判断され,自分で定義する必要はないが,出力ニューロンはやはり自分で判断しなければならない.