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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:50:31