ResNet人脸识别模型两类形状不兼容报错排查求助
ResNet人脸识别模型两类报错的解决方案
一、残差块Add层输入形状不匹配问题
报错根源
代码存在两个核心问题:
- 通道维度参数错误:输入张量形状为
(224,224,3)(通道在后的channels_last格式),但chanDim设为1,导致BatchNormalization层的维度计算混乱,间接影响形状匹配。 - 主路径与shortcut路径下采样倍数不一致:残差块的主路径连续两次应用了步长为
s的下采样(第一层Conv2D(1,1)和第二层Conv2D(3,3)都用了strides=(s,s)),而shortcut路径仅做了一次步长为s的下采样,导致两者输出形状的宽高维度相差s倍(比如第一次调用s=3时,主路径输出25x25,shortcut输出75x75)。
修复步骤
- 修正通道维度:将
chanDim改为-1(适配channels_last格式,自动识别最后一维为通道):
chanDim = -1
同时确保所有BatchNormalization层的axis参数统一使用chanDim:
bn2 = BatchNormalization(axis=chanDim, epsilon=bnEps, momentum=bnMom)(merge_input) # ... 其他BatchNormalization层同理 data = BatchNormalization(axis=chanDim)(data)
- 统一主路径与shortcut的下采样倍数:主路径仅在第一个卷积层应用步长
s,后续卷积层步长设为(1,1),确保主路径的下采样倍数与shortcut一致:
def resnet(layer_in, n_filters, s): data = layer_in # 主路径:仅第一层用步长s下采样 merge_input = Conv2D(n_filters, (1,1), strides=(s,s))(layer_in) bn2 = BatchNormalization(axis=chanDim, epsilon=bnEps, momentum=bnMom)(merge_input) act2 = Activation('relu')(bn2) # 第二层卷积步长改为(1,1),不再额外下采样 conv2 = Conv2D(n_filters, (3,3), strides=(1,1), use_bias=False, padding='same', kernel_initializer='he_normal')(act2) bn3 = BatchNormalization(axis=chanDim, epsilon=bnEps, momentum=bnMom)(conv2) act3 = Activation('relu')(bn3) conv3 = Conv2D(n_filters, (1,1), use_bias=False, kernel_initializer='he_normal')(act3) # shortcut路径保持原步长s,匹配主路径的下采样倍数 data = Conv2D(n_filters, (1,1), padding='valid', strides=(s,s))(data) data = BatchNormalization(axis=chanDim)(data) layer_out = Add()([conv3, data]) layer_out = Activation('relu')(layer_out) return layer_out
二、训练阶段损失函数形状不兼容问题
报错根源
使用categorical_crossentropy损失函数时,要求标签为one-hot编码格式(形状为(batch_size, num_classes),此处应为(batch_size,5)),但你的y_train是整数标签(形状为(batch_size,1)),导致模型输出((1,5))与标签((1,1))形状不匹配。
修复步骤
两种方案二选一:
- 将标签转为one-hot编码:
import tensorflow as tf y_train = tf.keras.utils.to_categorical(y_train, num_classes=5) # 若有验证集,y_val也需做同样转换
- 改用稀疏分类交叉熵损失:直接适配整数标签,无需one-hot编码,修改模型编译代码:
model.compile( loss='sparse_categorical_crossentropy', # 替换原损失函数 optimizer=optimizer, metrics=['accuracy'], run_eagerly=True )
内容的提问来源于stack exchange,提问作者nariaa 99
相关产品推荐
相关产品推荐

