《Python 深度学习》5.4 卷积神经网络的可视化(代码)

Visualizing what convnets learn

卷积神经网络的可视化

人们常说,深度学习模型是“黑盒”,即模型学到的表示很难用人类可以理解的方式来提取和呈现。虽然对于某些类型的深度学习模型来说,这种说法部分正确,但对卷积神经网络来说绝对不是这样。卷积神经网络学到的表示非常适合可视化,很大程度上是因为它们是视觉概念的表示。自 2013 年以来,人们开发了多种技术来对这些表示进行可视化和解释。我们不会在书中全部介绍,但会介绍三种最容易理解也最有用的方法。

  • 可视化卷积神经网络的中间输出(中间激活):有助于理解卷积神经网络连续的层如何对输入进行变换,也有助于初步了解卷积神经网络每个过滤器的含义。
  • 可视化卷积神经网络的过滤器:有助于精确理解卷积神经网络中每个过滤器容易接受的视觉模式或视觉概念。
  • 可视化图像中类激活的热力图:有助于理解图像的哪个部分被识别为属于某个类别,从而可以定位图像中的物体。

对于第一种方法(即激活的可视化),我们将使用 5.2 节在猫狗分类问题上从头开始训练的小型卷积神经网络。对于另外两种可视化方法,我们将使用 5.3 节介绍的 VGG16 模型。

1. 可视化中间激活

可视化中间激活,是指对于给定输入,展示网络中各个卷积层和池化层输出的特征图(层的输出通常被称为该层的激活,即激活函数的输出)。这让我们可以看到输入如何被分解为网络 学到的不同过滤器。我们希望在三个维度对特征图进行可视化:宽度、高度和深度(通道)。每个通道都对应相对独立的特征,所以将这些特征图可视化的正确方法是将每个通道的内容分别绘制成二维图像。我们首先来加载 5.2 节保存的模型。

from keras.models import load_model

model = load_model('cats_and_dogs_small_2.h5')
model.summary()  # As a reminder.( 作为提醒)

①预处理单张图像

img_path = 'D:\\Kaggle\\dogs-vs-cats-small\\test\\cats\\cat.1700.jpg'

# We preprocess the image into a 4D tensor(将图像预处理为一个 4D 张量)
from tensorflow.keras.preprocessing import image
import numpy as np

img = image.load_img(img_path, target_size=(150, 150))
img_tensor = image.img_to_array(img)
img_tensor = np.expand_dims(img_tensor, axis=0)
# Remember that the model was trained on inputs
# that were preprocessed in the following way:
# 请记住,训练模型的输入数据都用这种方法预处理

img_tensor /= 255.

# Its shape is (1, 150, 150, 3)(# 其形状为 (1, 150, 150, 3))
print(img_tensor.shape)

②显示测试图像

import matplotlib.pyplot as plt

plt.imshow(img_tensor[0])
plt.show()

 

  ③用一个输入张量和一个输出张量列表将模型实例化

from keras import models

# Extracts the outputs of the top 8 layers:(提取前 8 层的输出)
layer_outputs = [layer.output for layer in model.layers[:8]]
# Creates a model that will return these outputs, given the model input:(创建一个模型,给定模型输入, 可以返回这些输出)
activation_model = models.Model(inputs=model.input, outputs=layer_outputs)

④以预测模式运行模型 

# This will return a list of 5 Numpy arrays:
# one array per layer activation
# 返回 8 个 Numpy 数组组成的列表, 每个层激活对应一个 Numpy 数组
activations = activation_model.predict(img_tensor)

first_layer_activation = activations[0]
print(first_layer_activation.shape)

 ⑤将第4个通道可视化

import matplotlib.pyplot as plt

plt.matshow(first_layer_activation[0, :, :, 3], cmap='viridis')
plt.show()

 

⑥将第7个通道可视化 

plt.matshow(first_layer_activation[0, :, :, 7],cmap='viridis')

 

 

⑦ 将每个中间激活的所有通道可视化

import keras

# These are the names of the layers, so can have them as part of our plot
# 层的名称,这样你可以将这些名
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值