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:

 

 

 

 

 

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