前言
前文中已经实现了SimpleConvNet类,本文将通过把卷积层可视化,去了解在CNN层中到底实现了怎样的处理。
第一层权重的可视化
例如,假设第1层的卷积层的权重的形状是(30, 1, 5, 5),即30个大小为5 × 5、通道为1的滤波器。滤波器大小是5 × 5、通道数是1,意味着滤波器可以可视化为1通道的灰度图像。
通过对比学习前后的滤波器形状来比较权重的可视化。
代码如下:
# coding: utf-8
import numpy as np
import matplotlib.pyplot as plt
from simple_convnet import SimpleConvNet
def filter_show(filters, nx=8, margin=3, scale=10):
"""
c.f. https://gist.github.com/aidiary/07d530d5e08011832b12#file-draw_weight-py
"""
FN, C, FH, FW = filters.shape
ny = int(np.ceil(FN / nx))
fig = plt.figure()
fig.subplots_adjust(left=0, right=1, bottom=0, top=1, hspace=0.05, wspace=0.05)
for i in range(FN):
ax = fig.add_subplot(ny, nx, i+1, xticks=[], yticks=[])
ax.imshow(filters[i, 0], cmap=plt.cm.gray_r, interpolation='nearest')
plt.show()
network = SimpleConvNet()
# 随机进行初始化后的权重
filter_show(network.params['W1'])
# 学习后的权重
network.load_params("params.pkl")
filter_show(network.params['W1'])
不同滤波器对应输出图像中 不同方向上的边缘响应情况。
卷积层的滤波器会提取边缘(颜色分界线)或斑块(局部的块状区域)等原始信息。而刚才实现的CNN会将这些原始信息传递给后面的层。
基于分层结构的信息提取
第1层的卷积层中提取了边缘或斑块等“低级”信息,那么在堆叠了多层的CNN中,各层中又会提取什么样的信息呢?
随着层次加深,反映强烈的神经元也越来越抽象。
如图是一个物体识别的8层CNN。这个网络结构也称为AlexNet(堆叠了多层卷积层和池化层)
这个“抽象”的概念体现在随着层次的加深,提取的信息也越来越复杂,开始只是对简单的边缘有响应,接下来对纹理有响应。
几个具有代表性的CNN:AlexNet
AlexNet叠有多个卷积层和池化层,最后经由全连接层输出结果。
特点:
• 激活函数使用ReLU。
• 使用进行局部正规化的LRN(Local Response Normalization)层。
• 使用Dropout。
小结
① CNN在此前的全连接层的网络中新增了卷积层和池化层。
②使用im2col函数可以简单、高效地实现卷积层和池化层。
③通过CNN的可视化,可知随着层次变深,提取的信息愈加高级。
④ LeNet和AlexNet是CNN的代表性网络。
参考
《深度学习入门:基于Python的理论与实现 》斋藤康毅