CNN模型调用fit()时出现层不兼容问题求助
问题:CNN模型训练时层维度不兼容
模型代码
from keras.engine import input_layer from keras.models import Sequential from keras.layers import Dense , Activation , Dropout ,Flatten, BatchNormalization from keras.layers.convolutional import Conv2D from keras.layers.convolutional import MaxPooling2D face_model = Sequential() input_shape_face = (48, 48, 1) face_model.add(Conv2D(8, kernel_size= (3, 3), input_shape = input_shape_face, padding= 'same', activation = 'LeakyReLU')) face_model.add(MaxPooling2D(pool_size = (2, 2), padding= 'same')) face_model.add(Conv2D(16, kernel_size= (3, 3), padding= 'same', activation = 'LeakyReLU')) face_model.add(MaxPooling2D(pool_size = (2, 2), padding= 'same')) face_model.add(Conv2D(32, kernel_size= (3, 3), padding= 'same', activation = 'LeakyReLU')) face_model.add(MaxPooling2D(pool_size = (2, 2), padding= 'same')) face_model.add(Conv2D(64, kernel_size= (3, 3), padding= 'same', activation = 'LeakyReLU')) face_model.add(Flatten()) face_model.add(Dense(128, activation = 'LeakyReLU')) face_model.add(Dense(6, activation = 'softmax')) face_model.summary()
模型摘要
Model: "sequential_34" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_92 (Conv2D) (None, 48, 48, 8) 80 max_pooling2d_69 (MaxPoolin (None, 24, 24, 8) 0 g2D) conv2d_93 (Conv2D) (None, 24, 24, 16) 1168 max_pooling2d_70 (MaxPoolin (None, 12, 12, 16) 0 g2D) conv2d_94 (Conv2D) (None, 12, 12, 32) 4640 max_pooling2d_71 (MaxPoolin (None, 6, 6, 32) 0 g2D) conv2d_95 (Conv2D) (None, 6, 6, 64) 18496 flatten_8 (Flatten) (None, 2304) 0 dense_57 (Dense) (None, 128) 295040 dense_58 (Dense) (None, 6) 774 ================================================================= Total params: 320,198 Trainable params: 320,198 Non-trainable params: 0 _________________________________________________________________
编译与训练代码
# Compiling the model face_model.compile(loss= 'categorical_crossentropy', optimizer= 'adam', metrics= ['accuracy']) face_model.fit(facial_training_set, batch_size= batch_size, epochs= epochs, verbose= 1, validation_data= facial_testing_set)
错误信息
/usr/local/lib/python3.9/dist-packages/keras/engine/training.py in tf__train_function(iterator) 13 try: 14 do_return = True ---> 15 retval_ = ag__.converted_call(ag__.ld(step_function), (ag__.ld(self), ag__.ld(iterator)), None, fscope) 16 except: 17 do_return = False ValueError: in user code: File "/usr/local/lib/python3.9/dist-packages/keras/engine/training.py", line 1284, in train_function * return step_function(self, iterator) File "/usr/local/lib/python3.9/dist-packages/keras/engine/training.py", line 1268, in step_function ** outputs = model.distribute_strategy.run(run_step, args=(data,)) File "/usr/local/lib/python3.9/dist-packages/keras/engine/training.py", line 1249, in run_step ** outputs = model.train_step(data) File "/usr/local/lib/python3.9/dist-packages/keras/engine/training.py", line 1050, in train_step y_pred = self(x, training=True) File "/usr/local/lib/python3.9/dist-packages/keras/utils/traceback_utils.py", line 70, in error_handler raise e.with_traceback(filtered_tb) from None File "/usr/local/lib/python3.9/dist-packages/keras/engine/input_spec.py", line 280, in assert_input_compatibility raise ValueError( ValueError: Exception encountered when calling layer 'sequential_34' (type Sequential). Input 0 of layer "dense_57" is incompatible with the layer: expected axis -1 of input shape to have value 2304, but received input with shape (48, 384) Call arguments received by layer 'sequential_34' (type Sequential): • inputs=tf.Tensor(shape=(48, 48, 1), dtype=float32) • training=True • mask=None
核心问题:dense_57层期望输入最后一维维度为2304,但实际收到的输入形状为(48, 384),输入张量的形状为(48, 48, 1)。
解决方案
从错误信息和模型结构分析,问题根源是输入数据缺少批量维度,导致模型层计算逻辑混乱,具体修复步骤如下:
修正输入数据的维度
- 模型定义的输入形状是
(48,48,1),但Keras训练时要求输入是带批量维度的4D张量,格式为(样本数, 48,48,1)。 - 检查输入数据集的形状:如果是numpy数组,执行
print(facial_training_set.shape)确认。若输出为(N,48,48)(缺少通道维度),则扩展维度:import numpy as np facial_training_set = np.expand_dims(facial_training_set, axis=-1) facial_testing_set = np.expand_dims(facial_testing_set, axis=-1)
- 模型定义的输入形状是
验证模型前向传播
- 训练前用随机测试张量验证模型是否正常工作:
import tensorflow as tf test_input = tf.random.normal((1,48,48,1)) # 批量大小为1的测试输入 output = face_model(test_input) print(output.shape) # 正常应输出(1,6) - 若此步骤报错,说明模型结构存在问题;若正常,则输入数据维度是核心问题。
- 训练前用随机测试张量验证模型是否正常工作:
检查数据加载逻辑
- 如果使用
ImageDataGenerator加载数据,确保设置target_size=(48,48)和color_mode='grayscale',避免数据被错误加载为3通道RGB或其他尺寸。
- 如果使用
确认批量维度传递
- 错误中显示输入为
(48,48,1),说明模型接收到的是单个样本但未携带批量维度,Keras会将第一个维度误判为批量大小,导致后续层计算错误。必须保证输入数据的第一维是样本数量。
- 错误中显示输入为
内容的提问来源于stack exchange,提问作者Beyn18
相关产品推荐
相关产品推荐

