多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: