我们可以使用代码here
在MNIST数据集上训练一个简单的模型开始。使用keras-vis软件包,如果我们可以重新加载示例中训练的MNIST模型,并使用从零到十的过滤器索引绘制一位数字(例如“ 7”)的所有显着性图表,我们可以看到它是使用线性激活很难观察到对比度。
但是,使用softmax激活确实可以看到对比度。此外,我们需要手动设置一致的比例以查看对比度。
至少在缺陷检测主题方面,通过检查显着性可视化中的显着差异来了解如何将图像归为一件事而不归为另一物可能很重要。
from __future__ import print_function
from keras.datasets import mnist
import numpy as np
from matplotlib import pyplot as plt
from vis.visualization import visualize_saliency
from vis.utils import utils
from keras import activations
from keras.models import load_model
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# Load once for a model with softmax for last dense layer, and load again for one with linear swap
MODEL_PATH = "model.h5"
model = load_model(MODEL_PATH)
raw_model = load_model(MODEL_PATH)
# check layers in the model
NAMES = []
for index, layer in enumerate(model.layers):
NAMES.append(layer.name)
print(index, layer.name)
print('====================================================\n\n\n')
# swap softmax
layer_idx = utils.find_layer_idx(model, 'dense_2')
model.layers[layer_idx].activation = activations.linear
model = utils.apply_modifications(model)
# prepare a sample image '7'
img = x_test[0]/255
seed = img.copy()
seed = np.expand_dims(seed, 2)
seed = np.expand_dims(seed, 0)
# use absolute scale for the
MAX_PIXEL_softmax = 0.01
MAX_PIXEL_linear = 1
for index in range(10):
print('----------------------------------------------')
print('Digit: ', index)
f, ax = plt.subplots(1, 3)
grads_softmax = visualize_saliency(raw_model, layer_idx, filter_indices=index,
seed_input=seed, backprop_modifier="guided")
print('total:', round(grads_softmax.sum()*10000), ' max:', round(grads_softmax.max(),5), ' min:', round(grads_softmax.min(),5))
grads_softmax[0,0] = MAX_PIXEL_softmax
ax[0].set_title('Softmax ' + str(index))
ax[0].imshow(grads_softmax, cmap = 'jet')
grads_linear = visualize_saliency(model, layer_idx, filter_indices=index,
seed_input=seed, backprop_modifier="guided")
print('total:', round(grads_linear.sum()), ' max:', round(grads_linear.max(),5), ' min:', round(grads_linear.min(),5))
grads_linear[0,0] = MAX_PIXEL_linear
ax[1].set_title('Linear ' + str(index))
ax[1].imshow(grads_linear, cmap = 'jet')
ax[2].set_title('Raw image')
ax[2].imshow(img)
在作者的网页中指出
要可视化最终密集层输出上的激活,我们需要 由于输出的梯度,将softmax激活切换为线性 节点将取决于所有其他节点激活。在做这个 keras非常棘手,因此我们提供utils.apply_modifications进行修改 网络参数并重建图形。
如果不进行此交换,则结果可能不是最佳的。我们会 首先将“ softmax”换为“ linear”,然后比较会发生什么 如果我们最后不这样做的话。
但是显然,使用线性激活将使对比度消失。 我的代码中有什么错误使线性激活的行为如此?或者,如果我们需要显示对比度,那么使用softmax激活还是更好的选择?