繁体   English   中英

张量流中几个梯度的计算

[英]computation of several gradients in 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]是独立生成的...

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

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

可能有一些调整大小(我不知道,因为我不知道input_cnnoutput_scalars的大小)。

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

res = session.run(dydx, feed_dict=...)

单次计算dydx应该比单次计算dydx[i]慢1.5至2倍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM