def deprocess_image(x):
x -= x.mean()
x /= (x.std() + 1e-5)
x *= 0.1
x += 0.5
x = np.clip(x, 0, 1)
x *= 255
x = np.clip(x, 0, 255).astype('uint8')
return x/255
for layer_name in ['block1_conv1', 'block2_conv1', 'block3_conv1', 'block4_conv1']:
size = 64
margin = 5
results = np.zeros((8 * size + 7 * margin, 8 * size + 7 * margin, 3))
for i in range(8):
for j in range(8):
filter_img = generate_pattern(layer_name, i + (j * 8), size=size)
horizontal_start = i * size + i * margin
horizontal_end = horizontal_start + size
vertical_start = j * size + j * margin
vertical_end = vertical_start + size
results[horizontal_start: horizontal_end, vertical_start: vertical_end, :] = filter_img
plt.figure(figsize=(20, 20))
plt.imshow(results)
卷积神经网络中每一层都学习一组过滤器,以便将其输入表示为过滤器的组合
可视化类激活的热力图
类激活图(CAM,class activation map)可视化,它是指对输入图像生成类激活的热力图。类激活热力图是与特定输出类别相关的二维分数网格,对任何输入图像的每个位置都要进行计算,它表示每个位置对该类别的重要程度。
此处实现的方法是Grad-CAM: visual explanations from deep networks via gradient based localization。给定一张输入图像,对于一个卷积层的输出特征图,用类别相对于通道的梯度对这个特征图中的每个通道进行加权。
预处理图片:
from keras.applications.vgg16 import VGG16
model = VGG16(weights='imagenet')
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input, decode_predictions
import numpy as np
img_path = '../data/images/iceland-1979445__480.jpg'
# 变换形状为 (224, 224, 3) 的float32 格式的Numpy 数组
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
# CNN需要4维输入添加一个维度,将数组转换为(1, 224, 224, 3) 形状的批量
x = np.expand_dims(x, axis=0)
# 对批量进行预处理(按通道将颜色标准化)
x = preprocess_input(x)
书第5.4 卷积神经网络的可视化
卷积神经网络的可视化
卷积神经网络学到的表示非常适合可视化,很大程度上是因为它们是视觉概念的表示。 可视化的方法:
可视化中间激活
可视化中间激活,是指对于给定输入,展示网络中各个卷积层和池化层输出的特征图(层的输出通常被称为该层的激活,即激活函数的输出)。 三个维度对特征图进行可视化:宽度、高度和深度(通道)
卷积通道可视化
将每个中间激活的所有通道可视化:
可视化卷积神经网络的过滤器
在输入空间中进行梯度上升显示每个过滤器所响应的视觉模式。
需要构建一个损失函数,其目的是让某个卷积层的某个过滤器的值最大化;然后,我们要使用随机梯度下降来调节输入图像的值,以便让这个激活值最大化。
对于在ImageNet 上预训练的VGG16网络,其block3_conv1 层第0 个过滤器:
得到的图像张量是形状为(1, 150, 150, 3) 的浮点数张量,其取值可能不是[0, 255] 区间内的整数。因此,你需要对这个张量进行后处理,将其转换为可显示的图像:
生成过滤器可视化的函数:
生成某一层中所有过滤器响应模式组成的网格:
可视化类激活的热力图
类激活图(CAM,class activation map)可视化,它是指对输入图像生成类激活的热力图。类激活热力图是与特定输出类别相关的二维分数网格,对任何输入图像的每个位置都要进行计算,它表示每个位置对该类别的重要程度。
此处实现的方法是Grad-CAM: visual explanations from deep networks via gradient based localization。给定一张输入图像,对于一个卷积层的输出特征图,用类别相对于通道的梯度对这个特征图中的每个通道进行加权。
预处理图片:
可查看对于图片的预测
应用Grad-CAM 算法:
热力图后处理:
将热力图与原始图像叠加: