我正在尝试计算卷积神经网络的输出神经元相对于输入(图像的像素)的梯度。我目前通过对每个输出神经元使用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]都是独立生成的......
答案 0 :(得分:1)
首先,您可以将渐变定义为:
input_cnn
可能有一些调整大小(我不知道,因为我不知道output_scalars
和res = session.run(dydx, feed_dict=...)
的大小。)
然后,您可以一起计算所有dydx:
dydx
单次计算dydx[i]
的速度应该比.btn
的单次计算慢1.5到2倍。