[英]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_cnn
和output_scalars
的大小)。
然后,您可以一起计算所有dydx:
res = session.run(dydx, feed_dict=...)
单次计算dydx
应该比单次计算dydx[i]
慢1.5至2倍。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.