张量流中几个梯度的计算

时间:2016-11-24 09:53:28

标签: python machine-learning neural-network tensorflow

我正在尝试计算卷积神经网络的输出神经元相对于输入(图像的像素)的梯度。我目前通过对每个输出神经元使用tf.gradients函数来顺序计算这些:

input_cnn = session.graph.get_tensor_by_name("input:0")
output_cnn = session.graph.get_tensor_by_name("softmax2_pre_activation:0")

output_scalars = [tf.slice(output_cnn, [0, i], [1, 1]) for i in range(0, NUM_CLASSES)]
dydx = [tf.gradients(output_scalars[i], [input_cnn])[0] for i in range(0, NUM_CLASSES)]

然而,最后一行的执行需要很多时间(对于NUM_CLASSES = 1000,标准GPU上半小时)。此外,在Python会话中第一次计算梯度dydx [i]需要花费大量时间。然而,dydx [i]在同一会话中的后续调用非常快:

>> session.run(dydx[123], feed_dict={input_cnn: im1}) # Very slow
>> session.run(dydx[123], feed_dict={input_cnn: im2}) # Fast

是否有更有效的方法来计算这些梯度(即雅可比矩阵)?上述方法似乎并不是最优的,因为所有dydx [i]都是独立生成的......

1 个答案:

答案 0 :(得分:1)

首先,您可以将渐变定义为:

input_cnn

可能有一些调整大小(我不知道,因为我不知道output_scalarsres = session.run(dydx, feed_dict=...) 的大小。)

然后,您可以一起计算所有dydx:

dydx

单次计算dydx[i]的速度应该比.btn的单次计算慢1.5到2倍。