我有一组包含灰度图像的数据集,我希望在这些图像上训练一个最先进的卷积神经网络(CNN)。我非常希望能对预训练的模型(如这里的模型)进行微调。
问题在于,我能找到的几乎所有模型的权重都是在ImageNet数据集上训练的,而该数据集包含的是RGB图像。
我无法使用这些模型,因为它们的输入层期望的批次形状是(batch_size, height, width, 3)
或在我这里的(64, 224, 224, 3)
,但我的图像批次形状是(64, 224, 224)
。
有什么办法可以使用这些模型吗?我考虑过在加载权重后删除输入层并添加我自己的层(就像我们对顶层所做的那样)。这种方法正确吗?
回答:
模型的架构不能更改,因为权重已经针对特定的输入配置进行了训练。如果用你自己的层替换第一层,基本上会使其余权重变得无用。
— 编辑:根据Prune的建议进行了详细说明–
CNNs的设计使得它们越往深处,就能从前一层提取的低级特征中提取出更高层次的特征。删除CNN的初始层会破坏这种特征层次结构,因为后续层不会接收到它们应得的输入特征。在你的例子中,第二层已经被训练为期望第一层的特征。用随机权重替换你的第一层,相当于丢弃了对后续层所做的所有训练,因为它们需要重新训练。我怀疑它们无法保留在初始训练期间学到的任何知识。
— 编辑结束 —
不过,有一种简单的方法可以使你的模型适用于灰度图像。你只需让图像看起来像是RGB图像。最简单的方法是在新维度上将图像数组重复3次。因为你在所有3个通道上都有相同的图像,模型的性能应该和在RGB图像上一样。
在numpy中,可以轻松地这样做:
print(grayscale_batch.shape) # (64, 224, 224)rgb_batch = np.repeat(grayscale_batch[..., np.newaxis], 3, -1)print(rgb_batch.shape) # (64, 224, 224, 3)
这种方法的工作原理是首先创建一个新维度(用于放置通道),然后在该新维度上重复现有数组3次。
我还非常确定,keras的ImageDataGenerator可以将灰度图像加载为RGB图像。