You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)。


解决方案

从错误信息和模型结构分析,问题根源是输入数据缺少批量维度,导致模型层计算逻辑混乱,具体修复步骤如下:

  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)
      
  2. 验证模型前向传播

    • 训练前用随机测试张量验证模型是否正常工作:
      import tensorflow as tf
      test_input = tf.random.normal((1,48,48,1)) # 批量大小为1的测试输入
      output = face_model(test_input)
      print(output.shape) # 正常应输出(1,6)
      
    • 若此步骤报错,说明模型结构存在问题;若正常,则输入数据维度是核心问题。
  3. 检查数据加载逻辑

    • 如果使用ImageDataGenerator加载数据,确保设置target_size=(48,48)和color_mode='grayscale',避免数据被错误加载为3通道RGB或其他尺寸。
  4. 确认批量维度传递

    • 错误中显示输入为(48,48,1),说明模型接收到的是单个样本但未携带批量维度,Keras会将第一个维度误判为批量大小,导致后续层计算错误。必须保证输入数据的第一维是样本数量。

内容的提问来源于stack exchange,提问作者Beyn18

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 16:47:52