- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我从 Tensorflow 2.0
开始,并尝试实现 Guided BackProp 以显示显着图。我首先计算图像的 y_pred
和 y_true
之间的损失,然后找到由于这种损失导致的所有层的梯度。
with tf.GradientTape() as tape:
logits = model(tf.cast(image_batch_val, dtype=tf.float32))
print('`logits` has type {0}'.format(type(logits)))
xentropy = tf.nn.softmax_cross_entropy_with_logits(labels=tf.cast(tf.one_hot(1-label_batch_val, depth=2), dtype=tf.int32), logits=logits)
reduced = tf.reduce_mean(xentropy)
grads = tape.gradient(reduced, model.trainable_variables)
但是,我不知道如何处理梯度以获得引导传播。
这是我的模型。我使用 Keras 图层创建了它:
image_input = Input((input_size, input_size, 3))
conv_0 = Conv2D(32, (3, 3), padding='SAME')(image_input)
conv_0_bn = BatchNormalization()(conv_0)
conv_0_act = Activation('relu')(conv_0_bn)
conv_0_pool = MaxPool2D((2, 2))(conv_0_act)
conv_1 = Conv2D(64, (3, 3), padding='SAME')(conv_0_pool)
conv_1_bn = BatchNormalization()(conv_1)
conv_1_act = Activation('relu')(conv_1_bn)
conv_1_pool = MaxPool2D((2, 2))(conv_1_act)
conv_2 = Conv2D(64, (3, 3), padding='SAME')(conv_1_pool)
conv_2_bn = BatchNormalization()(conv_2)
conv_2_act = Activation('relu')(conv_2_bn)
conv_2_pool = MaxPool2D((2, 2))(conv_2_act)
conv_3 = Conv2D(128, (3, 3), padding='SAME')(conv_2_pool)
conv_3_bn = BatchNormalization()(conv_3)
conv_3_act = Activation('relu')(conv_3_bn)
conv_4 = Conv2D(128, (3, 3), padding='SAME')(conv_3_act)
conv_4_bn = BatchNormalization()(conv_4)
conv_4_act = Activation('relu')(conv_4_bn)
conv_4_pool = MaxPool2D((2, 2))(conv_4_act)
conv_5 = Conv2D(128, (3, 3), padding='SAME')(conv_4_pool)
conv_5_bn = BatchNormalization()(conv_5)
conv_5_act = Activation('relu')(conv_5_bn)
conv_6 = Conv2D(128, (3, 3), padding='SAME')(conv_5_act)
conv_6_bn = BatchNormalization()(conv_6)
conv_6_act = Activation('relu')(conv_6_bn)
flat = Flatten()(conv_6_act)
fc_0 = Dense(64, activation='relu')(flat)
fc_0_bn = BatchNormalization()(fc_0)
fc_1 = Dense(32, activation='relu')(fc_0_bn)
fc_1_drop = Dropout(0.5)(fc_1)
output = Dense(2, activation='softmax')(fc_1_drop)
model = models.Model(inputs=image_input, outputs=output)
如果需要,我很高兴提供更多代码。
最佳答案
这是来自 paper 的图形示例.
这个公式可以用下面的代码实现:
@tf.RegisterGradient("GuidedRelu")
def _GuidedReluGrad(op, grad):
gate_f = tf.cast(op.outputs[0] > 0, "float32") #for f^l > 0
gate_R = tf.cast(grad > 0, "float32") #for R^l+1 > 0
return gate_f * gate_R * grad
现在您必须使用以下方法覆盖 ReLU 的原始 TF 实现:
with tf.compat.v1.get_default_graph().gradient_override_map({'Relu': 'GuidedRelu'}):
#put here the code for computing the gradient
计算梯度后,您可以将结果可视化。然而,最后一点。您计算单个类的可视化。这意味着,您采用所选神经元的激活并将其他神经元的所有激活设置为零,以作为 Guided BackProp 的输入。
关于python - 如何在 Tensorflow 2.0 中应用 Guided BackProp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55924331/
刚刚用 python 编写了我的第一个神经网络类。据我所知,一切都应该有效,但其中有一些我似乎找不到的错误(可能正盯着我的脸)。我首先在 MNIST 数据的 10,000 个示例上进行了尝试,然后在尝
我在带有 BasicLSTMCells 的 tensorflow 中使用循环神经网络。基本上,我有一个单词 id 的输入序列,我将每个 id 转换为单词嵌入,通过 rnn 一次传递一个单词嵌入,然后在
我正在尝试通过多次向后传递迭代运行它并在每一步更新输入来最小化与某个目标相关的一些输入。第一遍运行成功,但第二遍出现以下错误: RuntimeError:变量元组的元素 0 是易变的 此代码片段演示了
在查看 Tensorflow 1.15 中的 OptimizerV2 代码时,我注意到他们使用 backprop.GradientTape 来计算梯度。 我找不到任何关于此类的在线引用,只能找到 tf
我正在尝试使用 TensorFlow 2.0 应用引导式反向传播 ( https://arxiv.org/abs/1412.6806 )。要应用引导反向传播,我们需要修改 relu 梯度。我读了How
我从 Tensorflow 2.0 开始,并尝试实现 Guided BackProp 以显示显着图。我首先计算图像的 y_pred 和 y_true 之间的损失,然后找到由于这种损失导致的所有层的梯度
我是一名优秀的程序员,十分优秀!