[英]ValueError: Error when checking input: expected conv2d_input to have 4 dimensions, but got array with shape
[英]Error when checking model input: expected conv2d_175_input to have 4 dimensions, but got array with shape (0, 1)
我想訓練一個從以下層開始的深度網絡:
def cnn_model():
model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',
input_shape=(3,48, 48),
activation='relu'))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Conv2D(64, (3, 3), padding='same',
activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Conv2D(128, (3, 3), padding='same',
activation='relu'))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(NUM_CLASSES, activation='softmax'))
return model
model = cnn_model()
# let's train the model using SGD + momentum (how original).
lr = 0.01
sgd = SGD(lr=lr, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
def lr_schedule(epoch):
return lr*(0.1**int(epoch/10))
使用以下生成器:
model = cnn_model()
# let's train the model using SGD + momentum
lr = 0.01
sgd = SGD(lr=lr, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
def lr_schedule(epoch):
return lr * (0.1 ** int(epoch / 10))
batch_size = 32
epochs = 30
model.fit(X, Y,
batch_size=batch_size,
epochs=epochs,
validation_split=0.2,
callbacks=[LearningRateScheduler(lr_schedule),
ModelCheckpoint('model.h5', save_best_only=True)]
)
(驗證生成器看起來類似)。
在訓練過程中,我得到了錯誤:
ValueError: Error when checking input: expected conv2d_175_input to have 4 dimensions, but got array with shape (0, 1)
輸入print(model.summary())
后得到以下輸出
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_175 (Conv2D) (None, 32, 48, 48) 896
_________________________________________________________________
conv2d_176 (Conv2D) (None, 32, 46, 46) 9248
_________________________________________________________________
max_pooling2d_85 (MaxPooling (None, 32, 23, 23) 0
_________________________________________________________________
dropout_103 (Dropout) (None, 32, 23, 23) 0
_________________________________________________________________
conv2d_177 (Conv2D) (None, 64, 23, 23) 18496
_________________________________________________________________
conv2d_178 (Conv2D) (None, 64, 21, 21) 36928
_________________________________________________________________
max_pooling2d_86 (MaxPooling (None, 64, 10, 10) 0
_________________________________________________________________
dropout_104 (Dropout) (None, 64, 10, 10) 0
_________________________________________________________________
conv2d_179 (Conv2D) (None, 128, 10, 10) 73856
_________________________________________________________________
conv2d_180 (Conv2D) (None, 128, 8, 8) 147584
_________________________________________________________________
max_pooling2d_87 (MaxPooling (None, 128, 4, 4) 0
_________________________________________________________________
dropout_105 (Dropout) (None, 128, 4, 4) 0
_________________________________________________________________
flatten_28 (Flatten) (None, 2048) 0
_________________________________________________________________
dense_43 (Dense) (None, 512) 1049088
_________________________________________________________________
dropout_106 (Dropout) (None, 512) 0
_________________________________________________________________
dense_44 (Dense) (None, 43) 22059
=================================================================
Total params: 1,358,155
Trainable params: 1,358,155
Non-trainable params: 0
我嘗試了什么? 我正在閱讀有關“ Convolution2D” /“輸入形狀”的文檔https://keras.io/layers/convolutional/ ,所以我嘗試更改input_shape,我知道我的輸出應該是4D,但我不知道如何要做到這一點。 如果可以提供幫助,請分享。
謝謝
正如@nuric所提到的,問題在於輸入圖像的尺寸。
如果您輸入的圖像的高度為48,寬度為48,輸入通道為3,則結果為(3,48,48),那么您對模型的輸入為(批處理大小為3、48、48)。
這里的批次大小不過是給模型進行訓練的單個批次中訓練圖像的數量
偽代碼
training_list = []
for i in range(0, batch_size):
image = read_image(training_set[i])
training_list.append(image)
training_set = numpy.array(training_list)
所以現在訓練集的維數是(批量大小,3、48、48)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.