Keras实现GoogLeNet时输出维度异常及predict报错排查
嘿,我来帮你拆解你遇到的两个核心问题:
一、输入尺寸与输出维度的计算差异
你提到的斯坦福公式是手动指定padding像素数时的标准卷积输出维度计算方式,但Keras的padding='same'(很多旧版GoogLeNet实现会用这个)在Theano后端的计算逻辑和这个公式有所不同:
Keras
padding='same'的逻辑:
当使用padding='same'时,Keras会自动计算所需的padding值,确保输出的空间维度是输入维度除以步长的整数结果(当输入维度能被步长整除时刚好是一半)。比如你用224x224输入、7x7卷积核、步长2,padding='same'会自动填充合适的像素,让输出刚好是112x112(224/2=112),这和你看到的结果一致。原论文227x227输入的原因:
InceptionV1原论文使用227x227输入,是因为当时的框架(Caffe)的卷积padding计算是显式指定padding像素数(比如第一层用padding=3),代入斯坦福公式计算:((227 - 7 + 2*3)/2) + 1 = 114
这和你用227x227输入Keras得到114x114的结果一致——这说明你的Keras代码里第一层的padding可能是valid或者显式设置了padding=3,而非same。
简单来说:Keras的padding='same'会自动适配padding来保证输出维度是输入的整数倍,而斯坦福公式是手动指定padding时的计算方式,两者的前提不同,所以结果有差异。
二、ValueError: CorrMM images and kernel must have the same stack size
这个错误是Theano后端卷积操作(CorrMM)的典型问题,核心原因是输入张量的通道数和卷积核的输入通道数不匹配,常见场景有两个:
输入张量的通道维度位置错误:
Theano后端默认的张量格式是(batch_size, channels, height, width),如果你的输入数据是按TensorFlow格式(batch_size, height, width, channels)传入的,就会导致通道维度不匹配——比如输入的通道数变成了224,而卷积核的输入通道是3,自然会报错。
你可以检查一下输入数据的预处理代码,确保把通道维度移到第二个位置,或者在模型的Input层里指定input_shape=(3, 224, 224)(Theano格式)。模型层的通道数配置错误:
检查Inception模块的各个分支,有没有写错卷积核的输出通道数,或者某个卷积层的filters参数配置错误,导致后续层的输入通道和当前层的卷积核通道不匹配。比如某个1x1卷积的输出通道数写错,导致下一层的卷积核输入通道数对不上。
建议你先排查输入数据的维度格式,再逐一核对模型各层的通道数配置,应该就能解决这个CorrMM错误。
内容的提问来源于stack exchange,提问作者Pallavi

