TensorFlow Keras CNN模型报错:输出深度需被组数整除(64 vs 3)
CNN训练二值图像报错解决
问题描述
使用TensorFlow Keras构建CNN训练二值图像时,运行代码出现报错:output depth must be evenly divisible by number of groups: 64 vs 3,仅当卷积层滤波器设为3时能正常运行,设为64等更大数值时触发错误。
已确认图像数据生成器可正常加载图像,生成器代码如下:
training_datagen = ImageDataGenerator( rescale = 1./255, horizontal_flip=True, vertical_flip=True, fill_mode='nearest') train_generator = training_datagen.flow_from_dataframe( dataframe=df_train_dominance, x_col="Filename", y_col="Dominance", target_size=(512, 512), class_mode='other') validation_datagen = ImageDataGenerator(rescale = 1./255) val_generator = validation_datagen.flow_from_dataframe( dataframe=df_test_dominance, x_col="Filename", y_col="Dominance", target_size=(512, 512), class_mode='other')
CNN模型代码:
import tensorflow as tf from tensorflow.keras.callbacks import EarlyStopping import time model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(filters=64, kernel_size=3, activation='relu', input_shape=(512, 512, 1)), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Conv2D(filters=64, kernel_size=3, activation='relu'), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(20, activation='relu'), tf.keras.layers.Dense(11, activation='softmax') ]) model.summary() epoch_steps = 250 validation_steps = len(df_test_dominance) model.compile(loss = 'mean_squared_error', optimizer='adam', metrics=['accuracy']) monitor = EarlyStopping(monitor='val_loss', min_delta=0, patience=5, verbose=1, mode='auto', restore_best_weights=True) start_time = time.time() history = model.fit(train_generator, verbose = 1, validation_data=val_generator, callbacks=[monitor], epochs=25)
已尝试添加padding、反转图像颜色,均未解决问题。
原因分析
报错核心是图像数据通道数与模型输入定义不匹配:
- 模型输入指定为单通道(
input_shape=(512,512,1)); - 但
flow_from_dataframe默认将图像加载为3通道RGB格式(即使原图像是单通道二值图),导致输入通道数为3; - TensorFlow的Conv2D默认会根据输入通道数分组,当滤波器数量能被输入通道数整除时(比如3能被3整除),分组逻辑正常运行;当无法整除时(比如64和3),就会触发分组不匹配的错误。
解决方法
方法1:强制生成器加载单通道图像
在flow_from_dataframe中添加color_mode="grayscale"参数,让生成器输出单通道图像,匹配模型输入:
# 修改训练生成器 train_generator = training_datagen.flow_from_dataframe( dataframe=df_train_dominance, x_col="Filename", y_col="Dominance", target_size=(512, 512), class_mode='other', color_mode="grayscale") # 修改验证生成器 val_generator = validation_datagen.flow_from_dataframe( dataframe=df_test_dominance, x_col="Filename", y_col="Dominance", target_size=(512, 512), class_mode='other', color_mode="grayscale")
方法2:修改模型输入为3通道
如果不需要单通道输入,直接将模型的input_shape改为3通道,匹配生成器默认的RGB格式:
model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(filters=64, kernel_size=3, activation='relu', input_shape=(512, 512, 3)), # 将1改为3 tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Conv2D(filters=64, kernel_size=3, activation='relu'), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(20, activation='relu'), tf.keras.layers.Dense(11, activation='softmax') ])
额外建议
模型最后一层用softmax对应多分类任务,但损失函数用了mean_squared_error,这属于不匹配的设置,建议根据标签格式替换为:
- 若标签是整数形式:
loss='sparse_categorical_crossentropy' - 若标签是one-hot编码:
loss='categorical_crossentropy'
内容的提问来源于stack exchange,提问作者steph
相关产品推荐
相关产品推荐

