几天没写东西了,想写自己的故事,又太矫情。今天的故事不长,主要是程序中碰到的两个Bug,记录一下解决方法。这两天在做CAE的pretrain和fine-tuning,白天给老板解释了一遍,感觉他听懂了。。。

两个Bug的Exception如下,我会逐个解释,

  1. ValueError: No gradients provided for any variable
  2. FailedPreconditionError: Attempting to use uninitialized value xxx

ValueError: No gradients provided for any variable

首先交代一下出错的语境,这里我在用tf.nn.softmax_cross_entropy_with_logits定义网络的损失函数,我的写法如下, 其中y表示网络预测的(输出的)labels, y_表示真实的labels。

1
loss = tf.nn.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=y_))

紧接着,实例化网络并进行测试,然后程序报错了,

1
ValueError: No gradients provided for any variable

具体的内容我就不截图了,因为论文还没投稿。这个错误的含义是网络中存在不能进行梯度传递的变量或者说是tensor。而导致这一错误的问题是我将labelslogits两个参数理解反了,这里的正确写法是,

1
loss = tf.nn.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))

也即logits代表网络的输出。除此之外,还要注意yy_均为one hot 形式,下面提供了向量形式转one hot形式的代码,实现方法比较naive。

1
2
3
4
5
def vec2onehot(label,numclass):
label_onehot = np.zeros((len(label),numclass))
for i,l in enumerate(label):
label_onehot[i, int(l)] = 1
return label_onehot

FailedPreconditionError: Attempting to use uninitialized value xxx

这个错误隐藏地比较深,诱发它的机制是我在做fine tuning时定义了新的需要训练的变量,但没有在session中进行初始化。报错的样例如下所示,

1
2
FailedPreconditionError: Attempting to use uninitialized value beta1_power_1
[[Node: beta1_power_1/read = Identity[T=DT_FLOAT, _class=[]...]]]

我的解决方法比较暴力,在做预训练之前定义好fine-tuning要用到的变量,与其他的变量一起做初始化。这样后面在重新训练的时候,直接调用sess.run即可。

Tip

单独列一个tip, 如果要多次训练网络,或者运行tensorflow的graph,建议在实例化session的时候用InteractiveSession而不是Session

References