tensorflow的batch_normlization踩坑记录

采用tensorflow的slim进行二分类任务时,遇到了很多问题,在此记录下来

在进行二分类时,我调用了https://github.com/kobiso/SENet-tensorflow-slim中nets文件下的各网络模型,其中包括lenet,resnet网络等,其中训练过程很顺利,然而在测试阶段时,由于is_train=False,resnet网络模型的加载就报错了。然而,参数和meta都是保存好的呀,捣鼓了很久,终于在网上找到了答案。

报错信息为:

FailedPreconditionError: Attempting to use uninitialized value .../.../batch_norm/moving_mean

大概就是说我的网络某一层的batch_norm的moving_mean没有初始化

解决方法如下:

训练阶段:

添加如下代码,其中is_train=True

update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
    self.optimizer = tf.train.AdamOptimizer(learning_rate).minimize(self.loss)

其次,在定义saver之前

var_list = [var for var in tf.global_variables() if "moving" in var.name]
var_list += tf.trainable_variables()
saver = tf.train.Saver(var_list=var_list, max_to_keep=20)

测试阶段:

is_train=False,相应地也要添加

var_list = [var for var in tf.global_variables() if "moving" in var.name]
var_list += tf.trainable_variables()
saver = tf.train.Saver(var_list=var_list, max_to_keep=20)

最后就没有出现未初始化的错误了

但是,为什么要这么做呢,之后再接着补充上

感谢https://www.jianshu.com/p/cb8ebcee1b15

发布了46 篇原创文章 · 获赞 17 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Jum_Summer/article/details/103315480