TensorFlow CNN中tf.nn.conv2d报错:输出深度与组数不匹配
问题分析与解决
从你给出的报错信息和维度打印结果来看,问题出在卷积核(filter)的通道维度不匹配上,这是tf.nn.conv2d()操作里最常见的错误类型之一。
错误原因详解
TensorFlow的tf.nn.conv2d()有一个硬性要求:卷积核的第三个维度(对应输入特征图的通道数)必须和当前输入特征图的通道数完全一致:
- 你的POOL1输出特征图维度是
(1000, 12, 12, 6),最后一位的6就是当前输入的通道数 - 但你定义的卷积核维度是
(5, 5, 1, 16),第三位的1是你设置的原始MNIST图像通道数(单通道),这和当前输入的6通道完全不匹配,所以触发了Depth of output (16) is not a multiple of the number of groups (6)的错误(这里的groups实际是指输入通道数,TensorFlow在通道不匹配时会用分组卷积的逻辑做校验,所以报错信息里提到了groups)
至于猫图像分类时能正常运行,大概率是巧合:猫图像是3通道,而你的CONV1输出通道数刚好也是3,导致卷积核的通道数(你用了原始图像的3通道)和上一层输出通道数匹配,蒙混过关,但这本质是不规范的写法。
修复方案
把卷积核的第三个维度从image_channels改成上一层的输出通道数(也就是CONV1的输出通道数6):
# 将第三个参数改为上一层的输出通道数6,而非原始输入的image_channels self.filter_convolutional_layer_2 = tf.Variable(tf.random.normal([CONV2_f,CONV2_f, 6, CONV2_n]))
更规范的写法是避免硬编码数字,直接从上层特征图的shape中获取通道数:
# 从POOL1的shape中动态获取输入通道数,适配性更强 input_channels = self.max_pool_layer_1.shape[-1] self.filter_convolutional_layer_2 = tf.Variable(tf.random.normal([CONV2_f,CONV2_f, input_channels, CONV2_n]))
修改后,卷积核的shape会变成(5,5,6,16),和输入特征图的6通道完全匹配,tf.nn.conv2d()就能正常执行了。
内容的提问来源于stack exchange,提问作者Phipsll
相关产品推荐
相关产品推荐

