采用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)
最后就没有出现未初始化的错误了
但是,为什么要这么做呢,之后再接着补充上