2017-07-02 10 views
0

私はモデルを訓練するためにMNISTデータセットを使用して手書き数字を分類しようとしています。私のモデルは練習に成功し、98.9%の精度を達成しました。私は、カスタムイメージを試してみて、入力するときしかし、それは私に次のエラーが表示されます。ニューラルネットワーク層の入力形状が正しくない

Error when checking : expected conv2d_4_input to have shape (None, 28, 28, 1) but got array with shape (1, 1, 28, 28) 

これはすなわち、入力層最初の畳み込み層です。 この問題を解決するにはどうすればよいですか? これは私の畳み込みニューラルネットワークである:

conv_model = Sequential() 
conv_model.add(Conv2D(filters, kernel_size[0], input_shape=(28 , 28 , 1))) 
conv_model.add(Activation(act)) 
conv_model.add(Conv2D(filters, kernel_size[0])) 
conv_model.add(Activation(act)) 
conv_model.add(MaxPool2D(pool_size=(2,2))) 
conv_model.add(Dropout(0.25)) 
conv_model.add(Flatten()) 
conv_model.add(Dense(128)) 
conv_model.add(Activation(act)) 
conv_model.add(Dropout(0.5)) 
conv_model.add(Dense(10)) 
conv_model.add(Activation('softmax')) 
#conv_model.summary() 

コンパイルの詳細:

conv_model.compile(loss='categorical_crossentropy', optimizer='adadelta', metrics=['accuracy']) 

完全なソースコード: https://github.com/tanmay-edgelord/HandwrittenDigitRecognition

画像:任意のさらなる詳細が必要な場合は enter image description here コメントしてください。

答えて

1

エラーメッセージがかなりストレートです:

  • あなたの第一層は、形状のデータを期待している(いずれも、28、28、1)、「なし」になることはできません任意の数(それはバッチサイズです、どのようにあなたが持っている多くの例)。
  • 一方、データの形は(1、1、28、28)です。

私はよく見かけるように、Kerasはチャンネルを最後の次元に置き、データには最初のチャンネルがあります。

策:(1、28、28、1):

ちょうど正しい形式でデータを再構築。


しかし、画像全体をモデルに表示しようとしていますか?もしそうなら、それはうまく動作しません、それは28×28ピクセルの画像を期待しています。

別の28x28画像で各番号を区切る必要があります。また、あなたのイメージが黒と白で反転している可能性を考慮する必要があります。通常、MNISTデータは、白い数字(1つの値)を持つ黒い背景(0値)を持ちます。

+0

でリシェイプ関数に渡すことで解決しましたこの場合は数字になります)。また、サイズ1、28、28、1をcv2.resizeに入力しようとしましたが、2つの引数しか期待できないというエラーが出ました。 –

+0

バックエンドでテンソルフローを使用しています –

+1

通常はcv2を使用し、後で結果を変更してください。準備ができたら 'model.predict'を使う直前に' roi'を作り直してください。 'roi'がnumpy配列なら、' roi = roi.reshape((1,28,28,1)) 'と同じくらい簡単です。もしそうでなければ、それはnumpyの配列にする: 'roi = np.array(roi)'。 –

0

問題は、すべての輪郭(私は関数cv2.contourが見つかったすべての輪郭のためcv2.resize機能を使って画像をリサイズしています正しい入力サイズ

roi2 = roi.reshape(1,28,28,1) 
関連する問題