[英]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.