keras中trainable问题测试

多gpu情况测试

测试1,冻结原模型的某一层,且此操作在生成多gpu模型之后,是否能够冻结权重?

答案:不能

 

测试2,冻结原模型的某一层,且此操作在生成多gpu模型之前,是否能够冻结权重?

答案:能。

 

结论:冻结某一层只需要冻结原模型,不需要冻结其生成的多gpu模型的对应层。但是冻结后,应重新生成一次多gpu模型。经过多次测试,都证明此结论。

多模型情况测试

参考生成网络结构,代码为

g = generator_model()
d = discriminator_model()


def train_multiple_outputs(batch_size, critic_updates=5, learning_rate=1E-4):
    d_on_g = generator_containing_discriminator_multiple_outputs(g, d)

    d_opt = keras.optimizers.Adam(lr=learning_rate, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
    d_on_g_opt = keras.optimizers.Adam(lr=learning_rate, beta_1=0.9, beta_2=0.999, epsilon=1e-08)

    d.trainable = True
    d.compile(optimizer=d_opt, loss=wasserstein_loss)
    d.trainable = False
    loss = [perceptual_loss, wasserstein_loss]
    loss_weights = [100, 1]
    d_on_g.compile(optimizer=d_on_g_opt, loss=loss, loss_weights=loss_weights)
    d.trainable = True
    d_losses = []
    d_on_g_losses = []
    output_true_batch, output_false_batch = np.ones((batch_size, 1)), -np.ones((batch_size, 1))
    for index in range(4000):

        image_full_batch, image_blur_batch = generate_one_batch_deblur_imgs(batch_size)

        generated_images = g.predict(x=image_blur_batch, batch_size=batch_size)

        for _ in range(critic_updates):
            d_loss_real = d.train_on_batch(image_full_batch, output_true_batch)
            d_loss_fake = d.train_on_batch(generated_images, output_false_batch)
            d_loss = 0.5 * np.add(d_loss_fake, d_loss_real)
            d_losses.append(d_loss)

        d.trainable = False

        d_on_g_loss = d_on_g.train_on_batch(image_blur_batch, [image_full_batch, output_true_batch])
        d_on_g_losses.append(d_on_g_loss)

        d.trainable = True

测试1:a、b模型,b的输入是a的输出,两者是否公用一个参数?如改变b中a的参数是否a的参数也会变?

 

测试2:单纯调整a的trainable,是否训练b时a中不能训练的参数会改变?

会改变,临时改变a的trainable,训练b,a也会变

 

测试3:

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章