- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个包含灰度图像的数据集,我想在这些图像上训练最先进的 CNN。我非常想微调一个预训练模型(比如那些 here )。
问题是几乎所有我能找到权重的模型都是在包含 RGB 图像的 ImageNet 数据集上训练的。
我不能使用其中一个模型,因为它们的输入层需要一批形状 (batch_size, height, width, 3)
或 (64, 224, 224, 3)
在我的例子中,但我的图像批处理是 (64, 224, 224)
。
有什么方法可以让我使用其中一个模型?我考虑过在加载权重并添加自己的权重后删除输入层(就像我们对顶层所做的那样)。这种做法是否正确?
最佳答案
模型的架构无法改变,因为权重已经针对特定的输入配置进行了训练。用你自己的替换第一层几乎会使其余的权重变得无用。
-- 编辑:Prune 建议的详细说明--
构建 CNN 的目的是,随着它们的深入,它们可以从前几层提取的低级特征中提取高级特征。通过移除 CNN 的初始层,您正在破坏特征的层次结构,因为后续层将不会接收它们应该作为输入的特征。在您的情况下,第二层已经过训练以期望第一层的特征。通过用随机权重替换第一层,您实际上是在丢弃在后续层上完成的所有训练,因为它们需要重新训练。我怀疑他们能否保留在初始培训中学到的任何知识。
---结束编辑---
不过,有一种简单的方法可以让您的模型处理灰度图像。您只需要使图像看起来 为 RGB。最简单的方法是在新维度上重复图像数组 3 次。因为您将在所有 3 个 channel 上拥有相同的图像,所以模型的性能应该与在 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)
它的工作方式是首先创建一个新维度(放置 channel ),然后在这个新维度上将现有数组重复 3 次。
我也很确定 keras 的 ImageDataGenerator可以将灰度图像加载为 RGB。
关于python - 如何使用预训练的神经网络处理灰度图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51995977/
我是一名优秀的程序员,十分优秀!