【问题标题】:how can we train two tensorflow model which one of them is a pre trained (frozen) network?我们如何训练两个张量流模型,其中一个是预训练(冻结)网络?
【发布时间】:2021-10-01 15:01:50
【问题描述】:

我在训练两个模型时遇到了一些困难,第一个模型的输出是第二个模型的输入(第二个模型单独训练)。

我附上了训练过程和模型的示意图。 训练模拟器模型的第一部分是可以的。为了训练生成器,我已经正确连接了两个模型,但结果与预期相差甚远。我的问题是:我应该定义一个自定义训练循环吗?以及如何定义正确的训练循环?

下面是两个连接模型的整体架构

input1 = keras.Input(shape=(100,), name='noise')
input2 = keras.Input(shape=(14,), name='contrast_vector')
[image_output, period_output] = generator([input1, input2])
Spectrum_output = simulator([image_output, period_output])
Final_model = keras.Model(inputs=[input1, input2], outputs=[image_output, 
period_output, Spectrum_output], name='Final_Model')

def ssim_loss(y_true, y_pred):
return  tf.reduce_mean(tf.image.ssim(y_true, y_pred, 1.0))


loss1 = ssim_loss
losses = [loss1, 'mse', 'mse']

Final_model.compile(
              loss= losses,
              loss_weights=[0.05, 0.01, 1.0],
              optimizer = keras.optimizers.Adam(learning_rate=1e-3, beta_1=0.5))


 history = Final_model.fit([noise_train, CT_vector_train], [y_train, period_train, 
 full_spec_train], batch_size=256, epochs=1000, validation_split=0.2)

模型架构:

张量流中的最终模型图:

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    简单的方法是只传递已经存在的输入和输出层

    Model(inputs=generator.inputs,
                outputs=simulator(generator.outputs))
    

    【讨论】:

    • 没什么区别,两种情况都会产生loss=nan [loss: nan - Generator_loss: nan - Generator_1_loss: nan - model_loss: nan]
    • 哦,我不认为模型是问题,如果你有 nan 是你的数据不匹配
    • 我已经检查了很多次数据集。我不认为是数据造成了麻烦。我的假设是,对于这个网络的结构,“model.fit”不合适,我应该定义一个自定义训练循环。你有什么想法吗?
    • 也许不是数据,而是您的损失函数尝试将 , axis=-1 添加到减少均值,如果这无济于事,请尝试仅使用一个损失函数来测试是否是导致此问题的形状跨度>
    • 感谢您的帮助。实际上我发现了问题,因为我的一个输出是二进制的(代表二进制图像)它使梯度变陡,因此模型无法很好地训练。我将图像更改为范围(0,1)并且模型工作正常。
    猜你喜欢
    • 2016-05-12
    • 1970-01-01
    • 2020-02-27
    • 2018-09-02
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    相关资源
    最近更新 更多