【问题标题】:Layer wise propagation(LRP) in keras neural networkkeras 神经网络中的逐层传播(LRP)
【发布时间】:2020-10-14 17:10:33
【问题描述】:

我一直在使用 pyTorch 跟踪 LRP 的实现,并希望使用 Tensorflow 和 Keras 对其进行测试。我在 Keras 中使用具有权重 (VGG16) 的相同模型,并且能够使用

成功执行 forward passelement wise division
# keras-tensorflow implementation
z = incr(clasifierLayers[l](A[l])) # forward pass step(1)
s = (R[l+1]/z) # Element wise division step(2)

但我在重新创建向后传球时遇到了麻烦。在使用 pyTorch 的原始代码 (LRP) 中,反向传递是使用

# pyTorch implementation
(z*s).sum().backward(); c = A[l].grad                  

当我尝试使用 tensorflow 查找复制后向传递时,我的梯度返回 None。这是我尝试计算后向传递的代码。

def getGradients(product,layer,l):
    with tf.GradientTape() as tape:
        tape.watch(product)
        a=layers[l](A[l])
        gradient = tape.gradient(product, a) 
    return gradient

c = getGradients((z*s).numpy().sum(),layers[l],l) # backward pass step(3)

谁能告诉我这个实现有什么问题?

提前致谢

【问题讨论】:

    标签: tensorflow keras conv-neural-network heatmap


    【解决方案1】:

    我尝试用一​​层复制问题并执行 LRP 后退步骤,代码如下:

    import tensorflow as tf
    
    x = tf.ones((1,10))
    layer=tf.keras.layers.Dense(10)
    y=layer(x)
    
    with tf.GradientTape() as tape:
         tape.watch(x)
         z = tf.keras.layers.Dense(10)(x)+1e-9
         s = y/z
         s = tf.reshape(s, z.shape)
         c = tape.gradient(tf.reduce_sum(z*s), x)
         y*c
    

    此代码有效,因为它将渐变返回到c。 我没有用数据集测试它,所以不知道它是否能正常工作。尽管如此,我认为你的代码的问题是你应该有第一个块:

    # keras-tensorflow implementation
    z = incr(clasifierLayers[l](A[l])) # forward pass step(1)
    s = (R[l+1]/z) # Element wise division step(2)
    

    在 TapeGradient 范围内并询问与 A[l] 相关的渐变。

    编辑: 我忘了避免通过s 传播渐变。梯度计算如下:

         c = tape.gradient(tf.reduce_sum(z*s.numpy()), x)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 2021-05-01
      • 2014-09-25
      • 2015-03-03
      • 2012-02-21
      • 2011-01-05
      • 1970-01-01
      相关资源
      最近更新 更多