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