Keras中ResNet50单通道输入报错,求解决方案
问题:ResNet50适配单通道输入报错的解决办法
输入图片

代码
resnet_model = tf.keras.models.Sequential() pretrained_model= tf.keras.applications.ResNet50(include_top=False, input_shape=(48,48,1), pooling='avg',classes=7, weights='imagenet') for layer in pretrained_model.layers: layer.trainable=False resnet_model.add(pretrained_model) resnet_model.add(tf.keras.layers.Flatten()) resnet_model.add(tf.keras.layers.Dense(512, activation='relu')) resnet_model.add(tf.keras.layers.Dense(5, activation='softmax'))
我希望将ResNet50用于单通道输入,但运行代码时出现错误,请问有什么解决办法?
解决办法
错误核心原因:预训练的ResNet50基于3通道RGB图像训练,第一层卷积层输入通道数固定为3,你指定的单通道输入(48,48,1)与该层通道数不匹配,导致报错。以下是三种可行方案:
方案1:将单通道输入复制为3通道(最简便)
在模型开头添加Lambda层,把单通道数据复制三次转换成3通道,直接兼容预训练权重:
resnet_model = tf.keras.models.Sequential() # 新增通道复制层,将单通道转为3通道 resnet_model.add(tf.keras.layers.Lambda(lambda x: tf.repeat(x, repeats=3, axis=-1), input_shape=(48,48,1))) pretrained_model= tf.keras.applications.ResNet50(include_top=False, input_shape=(48,48,3), # 改为3通道输入 pooling='avg',classes=7, weights='imagenet') for layer in pretrained_model.layers: layer.trainable=False resnet_model.add(pretrained_model) resnet_model.add(tf.keras.layers.Flatten()) resnet_model.add(tf.keras.layers.Dense(512, activation='relu')) resnet_model.add(tf.keras.layers.Dense(5, activation='softmax'))
方案2:修改ResNet50第一层卷积层适配单通道
手动调整第一层卷积层的输入通道为1,并将预训练的3通道权重取平均作为单通道初始权重,保留预训练优势:
# 先加载无权重的ResNet50,指定单通道输入 pretrained_model = tf.keras.applications.ResNet50(include_top=False, input_shape=(48,48,1), pooling='avg',classes=7, weights=None) # 加载预训练的3通道ResNet50权重 pretrained_weights = tf.keras.applications.ResNet50(weights='imagenet').get_weights() # 调整第一层卷积权重:将3通道权重平均为1通道 first_layer_weights = pretrained_weights[0] new_first_layer_weights = tf.reduce_mean(first_layer_weights, axis=2, keepdims=True) pretrained_weights[0] = new_first_layer_weights # 加载修改后的权重到模型 pretrained_model.set_weights(pretrained_weights) # 冻结预训练层 for layer in pretrained_model.layers: layer.trainable=False # 构建最终模型 resnet_model = tf.keras.models.Sequential([ pretrained_model, tf.keras.layers.Flatten(), tf.keras.layers.Dense(512, activation='relu'), tf.keras.layers.Dense(5, activation='softmax') ])
方案3:不使用预训练权重,从头训练
若无需预训练初始化优势,直接将weights设为None,模型可直接接受单通道输入,但训练需更多数据与时间,初始效果可能较差:
resnet_model = tf.keras.models.Sequential() pretrained_model= tf.keras.applications.ResNet50(include_top=False, input_shape=(48,48,1), pooling='avg',classes=7, weights=None) # 不加载预训练权重 for layer in pretrained_model.layers: layer.trainable=False resnet_model.add(pretrained_model) resnet_model.add(tf.keras.layers.Flatten()) resnet_model.add(tf.keras.layers.Dense(512, activation='relu')) resnet_model.add(tf.keras.layers.Dense(5, activation='softmax'))
内容的提问来源于stack exchange,提问作者Ashraya Dargarh
相关产品推荐
相关产品推荐

