在评估tf.gradients的结果时,Tensorflow卡住了

时间:2016-11-01 21:34:32

标签: python tensorflow deep-learning

我正在尝试使用我的网络评估输出的渐变。在前进道具期间,网络运行得非常好,所以没有问题。渐变的代码如下所示:

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

重新实现该论文

谢谢!

1 个答案:

答案 0 :(得分:0)

从Yaroslav的评论中可以看出,我被卡在inputs函数内的数据生成队列中。

我所做的是将变量images从队列输出更改为占位符:images = tf.placeholder(tf.float32, shape=(1, h, w, 6))

这允许我使用tf.gradients计算符号渐变,然后使用feed_dict中的grad[0].eval()为网络提供包含数据的numpy数组,而不是使用队列(这是我在训练中使用的那个)。

现在一切正常!