将输入通道数更改为预训练的keras.applications模型?

时间:2019-05-02 01:58:54

标签: python tensorflow keras deep-learning

我正在制作一个深度学习细分模型的原型,该模型需要六个输入通道(两个在不同光照条件下对齐的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中具有不同数量输入通道的数据上使用预训练模型是否有更好的方法?输入通道数不同时,预训练甚至会有所帮助吗?

2 个答案:

答案 0 :(得分: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()

但是,从概念上讲,我担心新输入看起来不太像预训练模型所基于的原始输入。

答案 1 :(得分:1)

跨模态预训练可能是您需要的方法。由Wang et al. (2016)提出,此方法对第一层通道中经过预训练的模型的权重取平均值,并用目标通道数复制平均值。实验结果表明,即使有20个输入通道,且输入形式不是RGB,使用这种预训练方法也可以使网络性能更好。

要应用此方法,可以参考another answer,它们使用layer.get_weights()和layer.set_weights()在预训练模型的第一层中手动设置权重。

相关问题