Two typical tensorflow exceptions
几天没写东西了,想写自己的故事,又太矫情。今天的故事不长,主要是程序中碰到的两个Bug,记录一下解决方法。这两天在做CAE的pretrain和fine-tuning,白天给老板解释了一遍,感觉他听懂了。。。
两个Bug的Exception如下,我会逐个解释,
- ValueError: No gradients provided for any variable
- 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。
紧接着,实例化网络并进行测试,然后程序报错了,
具体的内容我就不截图了,因为论文还没投稿。这个错误的含义是网络中存在不能进行梯度传递的变量或者说是tensor。而导致这一错误的问题是我将labels
和logits
两个参数理解反了,这里的正确写法是,
也即logits
代表网络的输出。除此之外,还要注意y
和y_
均为one hot 形式,下面提供了向量形式转one hot形式的代码,实现方法比较naive。
FailedPreconditionError: Attempting to use uninitialized value xxx
这个错误隐藏地比较深,诱发它的机制是我在做fine tuning时定义了新的需要训练的变量,但没有在session
中进行初始化。报错的样例如下所示,
我的解决方法比较暴力,在做预训练之前定义好fine-tuning要用到的变量,与其他的变量一起做初始化。这样后面在重新训练的时候,直接调用sess.run
即可。
Tip
单独列一个tip, 如果要多次训练网络,或者运行tensorflow的graph,建议在实例化session的时候用InteractiveSession
而不是Session
。