【发布时间】:2018-12-27 06:44:58
【问题描述】:
我正在尝试一个包含多个批处理规范层的模型。问题是当我恢复模型时,它似乎在为批量规范层选择随机权重(而不是训练中的总体权重)并产生糟糕的测试输出。
我查看了在线发布的多个解决方案,但还没有运气。请看下面的代码(包括我尝试过的解决方案)
我查看了 stackoverflow 并尝试了各种解决方案,包括添加批处理规范依赖项并确保指定了 saver var_list。似乎没有任何效果。
我使用的是 Tensorflow 1.10 版,我也尝试过使用 save_npz 和 load_and_assign_npz(同样的问题)。
这是我的模型的一部分看起来如何给你一个想法 -
1.model.py
def _batch_normalization(input_tensor, is_train, gamma_init, name):
return tf.layers.batch_normalization(input_tensor, training=is_train, name=name)
gamma_init = tf.random_normal_initializer(1., 0.02)
with tf.variable_scope("u_net_bn", reuse=reuse):
tl.layers.set_name_reuse(reuse)
inputs = InputLayer(x, name='inputs')
conv1 = Conv2d(inputs, 64, (3, 3), act=tf.nn.relu, name='conv1_1')
conv1 = _batch_normalization(conv1.outputs, is_train=is_train, gamma_init=gamma_init, name='bn1')
conv1 = InputLayer(conv1, name='bn1_fix')
conv1 = Conv2d(conv1, 64, (3, 3), act=tf.nn.relu, name='conv1_2')
conv1 = _batch_normalization(conv1.outputs, is_train=is_train, gamma_init=gamma_init, name='bn2')
conv1 = InputLayer(conv1, name='bn2_fix')
pool1 = MaxPool2d(conv1, (2, 2), name='pool1')
conv2 = Conv2d(pool1, 128, (3, 3), act=tf.nn.relu, name='conv2_1')
2.main.py
with tf.control_dependencies(extra_update_ops):
## Pretrain
g_optim_init = tf.train.AdamOptimizer(lr_v, beta1=beta1).minimize(mse_loss, var_list=g_vars)
## SRGAN
g_optim = tf.train.AdamOptimizer(lr_v, beta1=beta1).minimize(g_loss, var_list=g_vars)
d_optim = tf.train.AdamOptimizer(lr_v, beta1=beta1).minimize(d_loss, var_list=d_vars)
保存 --
saver = tf.train.Saver(var_list=tf.global_variables())
savepath = saver.save(sess, checkpoint_dir + '/g_{}_{}_init.npz'.format(tl.global_flag['mode'], epoch))
Restore --
sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=False))
saver = tf.train.Saver()
saver.restore(sess,tf.train.latest_checkpoint('./checkpoint'))
【问题讨论】:
-
你能确保检查点包含BN变量吗? stackoverflow.com/a/41870281/262432
标签: tensorflow