我正在尝试使用我的网络评估输出的渐变。在前进道具期间,网络运行得非常好,所以没有问题。渐变的代码如下所示:
images, labels = inputs(train_dir,
True,
batch_size,
num_batches,
one_hot_labels=True)
predictions = InterpolNet(images)
restorer = tf.train.Saver()
with tf.Session() as sess:
restorer.restore(sess, checkpoint_dir)
print 'Get grads'
grad_output = np.zeros((1,h,w,3), dtype=np.float32)
grad_output[0,0,0,0] = 1
grad = tf.gradients(predictions, images, grad_output)
print grad[0]
res = grad[0].eval()
所以基本上我用inputs
函数声明我的网络的输入,我通过调用InterpolNet
得到我的模型,然后用最新的训练权重恢复检查点。如果我现在在feed_dict中执行sess.run(predictions, feed_dict=feed_dict)
我输入一些输入,一切都很好,并且运行的输出是网络的预期输出。
当我尝试获取渐变时(使用上面的代码),程序显然卡在res = grad[0].eval()
行(0%GPU使用率和没有明显的CPU使用率)。 print grad[0]
打印出看似正确的张量:
Tensor("gradients/conv1/conv1_1/Conv2D_grad/Conv2DBackpropInput:0", shape=(1, 128, 384, 6), dtype=float32)
但代码未到达下一行。难道我做错了什么?使用grad_output
似乎不会对此问题产生影响。作为参考,我试图从https://arxiv.org/pdf/1603.06041v2.pdf
谢谢!
答案 0 :(得分:0)
从Yaroslav的评论中可以看出,我被卡在inputs
函数内的数据生成队列中。
我所做的是将变量images
从队列输出更改为占位符:images = tf.placeholder(tf.float32, shape=(1, h, w, 6))
。
这允许我使用tf.gradients
计算符号渐变,然后使用feed_dict
中的grad[0].eval()
为网络提供包含数据的numpy数组,而不是使用队列(这是我在训练中使用的那个)。
现在一切正常!