kaggle 猫狗数据集二分类 系列(4)使用神经网络可视化 去看网络中间层提取的特征是什么样子

系列(1)构建模型进行二分类,保存模型,画出走势图
系列(2)采用数据增强再次训练
系列(3)采用预训练网络再次训练
系列(4)使用神经网络可视化 去看网络中间层提取的特征是什么样子
可视化卷积核 Visualizing convnet filters
可视化类激活的热力图

卷积神经网络的可视化

1、可视化卷积神经网络的中间输出(中间激活):有助于理解卷积神经网络连续的层如何
对输入进行变换,也有助于初步了解卷积神经网络每个过滤器的含义。

2、可视化卷积神经网络的过滤器:有助于精确理解卷积神经网络中每个过滤器容易接受的
视觉模式或视觉概念。

3、可视化图像中类激活的热力图:有助于理解图像的哪个部分被识别为属于某个类别,从
而可以定位图像中的物体。

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

from keras.models import load_model

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

# 处理并显示一张猫的图片
img_path = 'cat1.jpg'
from 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)
img_tensor /= 255.
# 其形状为 (1, 150, 150, 3)
print('img_tensor.shape', img_tensor.shape)
import matplotlib.pyplot as plt

plt.imshow(img_tensor[0])

# 这个模型有一个输入和 8 个输出,即每层激活对应一个输出。
from keras import models

# 提取前 8 层的输出
layer_outputs = [layer.output for layer in model.layers[:8]]
# 创建一个模型,给定模型输入,可以返回这些输出
activation_model = models.Model(inputs=model.input, outputs=layer_outputs)
# 返回8个Numpy数组组成的列表,每个层激活对应一个 Numpy 数组
activations = activation_model.predict(img_tensor)

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

np.save("filename.npy", first_layer_activation[0, :, :, :])
b = np.load("filename.npy")
import matplotlib.pyplot as plt

# 对于测试的猫图像,第一层激活的第 4 个通道
# 第一层32个通道
# 拼成4*8的图
picture = np.zeros((b.shape[1] * 4, b.shape[0] * 8))
for i in range(32):
    picture[(i // 8) * 148:((i // 8) + 1) * 148, (i % 8) * 148:((i % 8) + 1) * 148] = b[:, :, i]
plt.matshow(picture, cmap='viridis', aspect='auto')


# 下面要画出每一个层的
layer_names = []
for layer in model.layers[:8]:
    layer_names.append(layer.name)
images_per_row = 16
for layer_name, layer_activation in zip(layer_names, activations):
    n_features = layer_activation.shape[-1]
    size = layer_activation.shape[1]
    n_cols = n_features // images_per_row
    display_grid = np.zeros((size * n_cols, images_per_row * size))
    for col in range(n_cols):
        for row in range(images_per_row):
            channel_image = layer_activation[0,:, :,col * images_per_row + row]
            channel_image -= channel_image.mean()
            channel_image /= channel_image.std()
            channel_image *= 64
            channel_image += 128
            channel_image = np.clip(channel_image, 0, 255).astype('uint8')
            display_grid[col * size: (col + 1) * size,
            row * size: (row + 1) * size] = channel_image
    scale = 1. / size
    plt.figure(figsize=(scale * display_grid.shape[1],scale * display_grid.shape[0]))
    plt.title(layer_name)
    plt.grid(False)
    plt.imshow(display_grid, aspect='auto', cmap='viridis')
plt.show()

结果
我在网上下载的小猫:
kaggle 猫狗数据集二分类 系列(4)使用神经网络可视化 去看网络中间层提取的特征是什么样子_第1张图片
我拼接了一下第一层:
kaggle 猫狗数据集二分类 系列(4)使用神经网络可视化 去看网络中间层提取的特征是什么样子_第2张图片
书里拼接了所有的,越到后面层,小猫越开始“抽象了起来”。
kaggle 猫狗数据集二分类 系列(4)使用神经网络可视化 去看网络中间层提取的特征是什么样子_第3张图片
再到后来,可视化出来的东西已经分不清是什么。
kaggle 猫狗数据集二分类 系列(4)使用神经网络可视化 去看网络中间层提取的特征是什么样子_第4张图片

书上总结了,越到后面的层关于视觉的信息就少了,后面的都是有助于分类器分类的信息。有的过滤器是空白的,越来越稀疏了。
kaggle 猫狗数据集二分类 系列(4)使用神经网络可视化 去看网络中间层提取的特征是什么样子_第5张图片
一样的程序,我把小猫程序换成一辆车,可以看到前面的几层视觉都挺好,底层次的过滤器提取图像的底层次特征,有点像我们人脑看轮廓的感觉。
kaggle 猫狗数据集二分类 系列(4)使用神经网络可视化 去看网络中间层提取的特征是什么样子_第6张图片
kaggle 猫狗数据集二分类 系列(4)使用神经网络可视化 去看网络中间层提取的特征是什么样子_第7张图片
在这里插入图片描述

2、可视化卷积神经网络的过滤器

你可能感兴趣的:(机器学习)