CNNを使用して手書き数字MNIST28x28グレースケール画像を分類する画像分類モデルを構築していますこれが私のレイヤー定義です
model = keras.Sequential()
model.add(keras.layers.Conv2D(64,(3,3),activation='relu',input_shape=(28,28,1)))
model.add(keras.layers.MaxPool2D((2,2)))
model.add(keras.layers.Conv2D(64,(3,3),activation='relu'))
model.add(keras.layers.MaxPool2D((2,2)))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(200,activation='relu'))
model.add(keras.layers.Dense(10,activation='softmax'))
しかし、モデルをフィットさせるとこのエラーが発生します
ValueError: Input 0 of layer sequential_6 is incompatible with the layer: : expected min_ndim=4, found ndim=3. Full shape received: [32, 28, 28]
また、Conv2Dレイヤーのinput_shapeで1を指定する必要がある理由も知りたいです。画像の形状は28x28ですが、そこで1を指定する必要があります。
動作するはずの最小限の変更は、行を変更することです。
model.add(keras.layers.Conv2D(64,(3,3),activation='relu',input_shape=(28,28,1)))
これに、1
:を削除します
model.add(keras.layers.Conv2D(64,(3,3),activation='relu',input_shape=(28,28)))
エラーが発生する理由は、入力画像が28x28であり、ネットワークにフィードするバッチサイズに32枚の画像があるため、次元の配列[32、28、28]です。残念ながら、入力をネットワークにフィードする方法がわかりません。しかし、現在のコードが期待しているのは、次元の配列[32、28、28、1]です。それがあなたが操作できる厄介な配列であるならば、そのreshape()
ような次元にそれだけで問題を解決するでしょう。
上で提案したのは、逆のことを行うことです。ネットワークに、次元の3D配列[28,28,1]ではなく次元の2D配列[28,28]の各画像を期待するように依頼します。
更新:
それを機能させるために、次のコード変更を提供しました。
train_image=train_image.reshape(60000, 28, 28, 1)
train_image=train_image / 255.0
test_image = test_image.reshape(10000, 28, 28, 1)
test_image=test_image/255.0
これが行うことは、入力画像が単一の巨大なnumpy配列にあり、モデルをそれに直接適合させることです。モデル適合関数は、最初の次元からこの配列から「テンソル」を選択し、各トレーニングステップのバッチを作成します。バッチサイズは32であるため、形状の配列(32、28、28、1)が暗黙的に作成され、レイヤーに渡されます。2次元から4次元は、元の配列からコピーされるだけです。
reshape()
コマンドは、配列の次元を変更することです。形状変更前の元の配列は(60000、28、28)であり、単一の数値シーケンスとしてレイアウトすると、6000x28x28の浮動小数点数になります。どのようなreshape()
行いは、これらの番号をピックアップし、それを正確に充填することができるので、60000x28x28x1数字を期待(60000、28、28、1)配列、にそれらを満たすことです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加