【问题标题】:Issue with saving/restoring batch norm layers (TensorFlow)保存/恢复批量规范层的问题 (TensorFlow)
【发布时间】: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'))

【问题讨论】:

标签: tensorflow


【解决方案1】:

如果不查看完整的源代码,很难说在您的特定情况下出了什么问题。保存/恢复 BN 层似乎可以正常工作。

>>> import tensorflow as tf
>>> tf.__version__
'1.10.0'
>>> bn = tf.layers.batch_normalization(tf.placeholder(tf.float32, shape=(1, 1)))
>>> init = tf.global_variables_initializer()
>>> sess = tf.Session()
>>> sess.run(init)
>>> sess.run(tf.global_variables())
[array([1.], dtype=float32), array([0.], dtype=float32), array([0.], dtype=float32), array([1.], dtype=float32)]

请注意,所有全局变量均已由 BN 层创建。训练循环将进行增量更新,可以通过以下方式进行模拟。

>>> for v in tf.global_variables():
...     sess.run(v.assign([42]))
... 
array([42.], dtype=float32)
array([42.], dtype=float32)
array([42.], dtype=float32)
array([42.], dtype=float32)

所有变量现在都等于[42]。是时候保存/恢复了。

>>> saver = tf.train.Saver(tf.global_variables())
>>> saver.save(sess, "/tmp/chkpt")
'/tmp/chkpt'
>>> sess.run(init)  # Reinitialize all variables.
>>> sess.run(tf.global_variables())
[array([1.], dtype=float32), array([0.], dtype=float32), array([0.], dtype=float32), array([1.], dtype=float32)]

最后两行确保变量被重置为其初始值。终于

>>> saver.restore(sess, "/tmp/chkpt")
INFO:tensorflow:Restoring parameters from /tmp/chkpt
>>> sess.run(tf.global_variables())
[array([42.], dtype=float32), array([42.], dtype=float32), array([42.], dtype=float32), array([42.], dtype=float32)]

【讨论】:

    猜你喜欢
    • 2018-01-29
    • 2018-03-30
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多