我相信您可以使用一个预训练的ResNet来处理单通道灰度图像,而不需要将图像重复三次。
我的做法是替换第一层(这是PyTorch而不是Keras,但思路可能类似):
(conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
使用以下层:
(conv1): Conv2d(1, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
然后将权重的总和(在通道轴上)复制到新层中,例如,原始权重的形状为:
torch.Size([64, 3, 7, 7])
所以我这样做了:
resnet18.conv1.weight.data = resnet18.conv1.weight.data.sum(axis=1).reshape(64, 1, 7, 7)
然后检查新模型的输出是否与灰度图像的输出相同:
y_1 = model_resnet_1(input_image_1)
y_3 = model_resnet_3(input_image_3)
print(torch.abs(y_1).sum(), torch.abs(y_3).sum())
(tensor(710.8860, grad_fn=<SumBackward0>),
tensor(710.8861, grad_fn=<SumBackward0>))
input_image_1: 单通道图像
input_image_3: 三通道图像(灰度 - 所有通道相等)
model_resnet_1: 修改后的模型
model_resnet_3: 原始的resnet模型