2017-07-02 36 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 x 28像素的圖像。

您將不得不在每個不同的28×28圖像中分隔每個數字。你必須考慮到你的形象在黑色和白色方面被顛倒的可能性。通常MNIST數據具有黑色背景(0值)和白色數字(1個值)。

+0

我用cv2.resize功能,爲每個功能cv2.contour發現輪廓調整圖像傳遞給重塑功能(每輪廓解決在這種情況下將是一個數字)。此外,我試着輸入大小1,28,28,1到cv2.resize,但它給了我只有2個參數預計的錯誤。我強烈建議您檢出performRecognition代碼 –

+0

我在後端使用張量流 –

+1

正常使用cv2並稍後重新設計結果。準備完成後重塑'roi',就在使用'model.predict'之前。如果'roi'是一個numpy數組,就像'roi = roi.reshape((1,28,28,1))'一樣簡單。如果沒有,使它成爲一個numpy數組:'roi = np.array(roi)'。 –

0

的問題得到了由使用了正確的輸入大小

roi2 = roi.reshape(1,28,28,1)