【问题标题】:Change number of input channels to pretrained keras.applications model?将输入通道数更改为预训练的 keras.applications 模型?
【发布时间】:2019-05-02 01:58:54
【问题描述】:

我正在设计一个深度学习分割模型的原型,该模型需要六个输入通道(两个在不同光照条件下对齐的 448x448 RGB 图像)。我希望将几个预训练模型的性能与我从头开始训练的当前模型的性能进行比较。我可以将tf.keras.applications 中的预训练模型用于超过 3 个通道的输入图像吗?

我尝试先应用卷积将通道维度减少到 3,然后将该输出传递给 tf.keras.applications.DenseNet121(),但收到以下错误:

import tensorflow as tf
dense_input = tf.keras.layers.Input(shape=(448, 448, 6))
dense_filter = tf.keras.layers.Conv2D(3, 3, padding='same')(dense_input)
dense_stem = tf.keras.applications.DenseNet121(include_top=False, weights='imagenet', input_tensor=dense_filter)
*** ValueError: You are trying to load a weight file containing 241 layers into a model with 242 layers.

有没有更好的方法在 keras 中对具有不同输入通道数量的数据使用预训练模型?当输入通道的数量不同时,预训练是否会有所帮助?

【问题讨论】:

    标签: python tensorflow keras deep-learning


    【解决方案1】:

    从技术上讲,这应该是可能的。也许使用模型的__call__ 本身:

    orig_model = tf.keras.applications.DenseNet121(include_top=False, weights='imagenet')
    dense_input = tf.keras.layers.Input(shape=(448, 448, 6))
    dense_filter = tf.keras.layers.Conv2D(3, 3, padding='same')(dense_input)
    output = orig_model(dense_filter)
    
    model = tf.keras.Model(dense_input, output)
    model.compile(...)
    model.summary()
    

    不过,在概念层面上,我担心新输入看起来与训练预训练模型的原始输入不太一样。

    【讨论】:

      【解决方案2】:

      作为在预训练架构之前添加卷积层的补充方法,例如tf.keras.applications 中可用的任何使用 RGB 输入训练的预训练模型,您可以考虑操作现有权重,以便它们与您的模型与 6 通道输入相匹配。例如,如果除了添加的输入模式之外您的架构保持不变,您可以将绿色通道重复到新添加的 3 个输入通道:请参阅here

      “有没有更好的方法在 keras 中对具有不同输入通道数量的数据使用预训练模型?当输入通道数量不同时,预训练是否会有所帮助?”

      上述和常用的技术

      • 在预训练架构之前添加卷积层以转换模态
      • 重复预训练通道以匹配新添加的模态

      启用迁移学习,这几乎总是比从头开始训练更好的选择。但是,不要指望没有一些再培训,这两个选项都不起作用。在我看来/经验,后者更好。原因是前一种方法中随机初始化的 Conv 层将(至少在最初)导致与架构的其余部分“习惯看到”完全不同的输入。这已经在@Kris 之前的回答中得到了推理。后一种技术利用了许多相关特征在不同输入模式中非常相似的事实:即使在新添加的输入模式(例如 RGB 与热光)中,狗可能仍然看起来像狗。

      【讨论】:

        【解决方案3】:

        Cross Modality Pre-training 可能是您需要的方法。由Wang et al. (2016) 提出,该方法将预训练模型的权重在第一层的通道中平均,并通过目标通道的数量复制平均值。实验结果表明,使用这种预训练方法的网络即使有20个输入通道且输入模态不是RGB,也能获得更好的性能。

        要应用这一点,可以参考another answer 使用 layer.get_weights() 和 layer.set_weights() 手动设置预训练模型第一层的权重。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-09-25
          • 1970-01-01
          • 1970-01-01
          • 2021-08-04
          • 1970-01-01
          • 1970-01-01
          • 2019-04-14
          • 1970-01-01
          相关资源
          最近更新 更多