可视化卷积神经网络的 中间激活

前言

可视化卷积神经网络连续的层如何对输入进行变换有助于了解卷积神经网络每个过滤器的含义。

一、加载模型

加载https://blog.csdn.net/weixin_40356612/article/details/107639569文章中保存的模型。

from keras.models import load_model

model = load_model('cats_and_dogs_small_2.h5')

二、单张图片处理

from keras.preprocessing import image
import numpy as np
import matplotlib.pyplot as plt

img_path = "./dogs_and_cats_small/test/cats/cat.1700.jpg"
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.
print(img_tensor.shape)

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

输出为:(1, 150, 150, 3)
以及一只可爱的猫咪:
在这里插入图片描述

三、可视化单通道特征图

from keras import models
import matplotlib.pyplot as plt

layer_outputs = [layer.output for layer in model.layers[:8]]
activation_model = models.Model(inputs=model.input, outputs=layer_outputs)  # 允许有多个输出
activations = activation_model.predict(img_tensor)     # 上张猫咪图,返回8个np数组构成的列表
first_layer_activation = activations[0]
print(first_layer_activation.shape)  
plt.matshow(first_layer_activation[0, :, :, 5], cmap='viridis')

输出为:(1, 148, 148,32)
以及一张单通道特征图:
在这里插入图片描述

四、可视化所有层的各通道特征图

layer_names = []
for layer in model.layers[:8]:
    layer_names.append(layer)

images_per_row = 16   # 每行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, size * images_per_row))

    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()

输出:
第一卷积层:
在这里插入图片描述
第三卷积层:
在这里插入图片描述
第五卷积层:
在这里插入图片描述
第7卷积层
在这里插入图片描述

五、结论

  • 第一层是各种边缘探测器的集和,激活几乎保留了原始图像的所有信息;
  • 随着层数加深,激活变得越来越抽象和在直观上难以理解。
  • 层数越深,其表示关于图像视觉内容的信息就越少,关于内别的信息就越多。也就是更高的激活层包含关于特定输入的信息越来越少,而关于目标的 信息越来越多。可将深度神经网络比作信息蒸馏管道,将输入数据反复进行变换,过滤调无用的信息,放大和细化有用的信息。
  • 这种方式和人类以及动物感知世界的方式类似。

参考文献

  • 佛朗索瓦.肖莱著,张亮译. Python深度学习[M]. 人民邮电出版社.2018.8.p130-136.

END

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

windawdaysss

觉得文章有用,可以请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值