将输入通道的数量更改为预处理的keras.应用模型



i正在制作一个深度学习分割模型,该模型需要六个输入通道(在不同的照明条件下有两个对齐的448x444 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中使用不同数量的输入通道的数据上使用审慎的模型?当输入通道的数量不同时,预处理甚至会有所帮助吗?

从技术上讲,应该有可能。也许使用模型的__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()

在概念层面上,我担心新输入看起来不像训练有素的模型的原始输入。

交叉模态预训练可能是您需要的方法。Wang等人提出的。(2016年(,此方法平均在第一层的通道上平均进行预训练的模型的权重,并通过目标通道的数量来复制平均值。实验结果表明,通过使用此类预训练方法甚至具有20个输入通道,其输入模式不是RGB。

要应用此信息,可以参考使用layer.get_weights((和layer.set_weights((手动设置预训练模型第一层的权重的另一个答案。

作为在预训练架构之前添加卷积层的补充方法,例如tf.keras.applications中可用的任何预先训练的模型经过RGB输入培训,您可以考虑操纵现有的权重,以便它们可以与您的模型与6通道输入相匹配。例如,如果您的体系结构除了增加输入模式外,您可以重复绿色通道到新添加的3个输入频道:请参阅此处。

"有没有更好的方法在KERAS中使用不同数量的输入通道的数据上使用审慎的模型?当输入频道的数量不同时,预处理甚至会有所帮助吗?"

上述技术和常用技术

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

启用转移学习,这实际上总是比从头开始培训更好的选择。但是,不要指望没有任何重新培训的任何选项都可以使用。我认为,后者更好。原因是(至少最初(在前者方法中的随机初始化的转与层将产生与其他体系结构所习惯的"习惯"的输入。@Kris的早期答案中已经理解了这一点。后一种技术利用了以下事实:许多相关特征在不同的输入方式中相当相似:即使在新添加的输入方式中,狗也可能看起来像狗(例如,RGB与热灯(。

(。

最新更新