如何将预训练的神经网络用于灰度图像?

我有一组包含灰度图像的数据集,我希望在这些图像上训练一个最先进的卷积神经网络(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图像。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注