关于卷积神经网络
大家好,关于卷积神经网络(Convolutional Neural Networks, CNN)的概念,这里就不啰嗦了,网上的内容太多了。然而对初学者,在学到各层的概念时,理解不是很深刻。本文介绍几种常见的层,希望能帮助初学者理解。
与普通神经网络类似,卷积神经网络的结构也是逐层链接的。其中,常见的层当属卷积层,除此之外,还有一些其他的层。
卷积层
卷积层是CNN中的基本网络层,主要用于对图像进行特征提取操作,其卷积核权重是共享权值的,对应的相关概念还包括步长,填充。
import torch
from torch import nn
# 创建数据 img:2 张具有 3 个通道的图像,大小为 5*6
img = torch.arange(30*6, dtype=torch.float).reshape(-1, 3, 5, 6)
print(img.shape) # (2, 3, 5, 6)
# 对 img 进行卷积操作:用 2*2 大小的核进行卷积,
'''
说明:由 3 通道的图像变到 4 通道特征,这需要 4 个核
(1) 每个核都要作用在 3 通道图像上,故每个核的实际大小为 3*2*2(12 个参数)
(2) 生成 4 通道特征,因此需要 4 个核,故本层的实际参数量为 4*3*2*2 = 48 个
'''
L = nn.Conv2d(3, 4, kernel_size=(2,2))
img = L(img)
print(img.shape)
# 显示该层包含的参数
print(L.state_dict().keys()) # odict_keys(['weight', 'bias'])
print(L.state_dict()['weight'].shape) # (4, 3, 2, 2):核的实际大小
print(L.state_dict()['bias'].shape) # (4):每个核需要一个偏置
# 继续对 img 进行卷积操作:用 3*3 大小的核进行卷积,
'''
说明:由 4 通道的图像变到 2 通道特征,这需要 2 个核
(1) 每个核都要作用在 4 通道图像上,故每个核的实际大小为 4*3*3(36 个参数)
(2) 生成 2 通道特征,因此需要 2 个核,故本层的实际参数量为 2*4*3*3 = 72 个
'''
img = nn.Conv2d(4, 2, kernel_size=3, padding=3)(img)
print(img.shape)
# 再次对 img 进行卷积操作:用 2*2 大小的核进行卷积,
'''
说明:由 2 通道的图像变到 5 通道特征,这需要 5 个核
(1) 每个核都要作用在 2 通道图像上,故每个核的实际大小为 2*2*2(8 个参数)
(2) 生成 5 通道特征,因此需要 5 个核,故本层的实际参数量为 5*2*2*2 = 40 个
(3) 本层中加入了 padding 和 stride 参数,其含义请自己查阅文档
'''
img = nn.Conv2d(2, 5, kernel_size=2, padding=1, stride=2)(img)
print(img.shape)
# 再做一次卷积,请大家自己分析(加入了 dilation 参数)
img = nn.Conv2d(5, 10, kernel_size=3, padding=(2,1), dilation=2)(img)
print(img.shape)
激活层
# 仅以 ReLU 为例。若要了解其他常用的激活函数,请查阅文档
L = nn.ReLU(inplace=True) # inplace 表示直接在原始数据上进行激活
img = L(img)
print(img.shape)
print(L.state_dict()) # 激活层一般不需要参数,所以本行输出空
池化层
# 这里用最大化池化方式进行池化,其他方法请查阅文档
img = nn.MaxPool2d(kernel_size=2, stride=2, padding=1)(img)
print(img.shape)
特殊的池化层
# 为了使池化后的图像尺寸满足特定要求,可以用自适应池化
# 下面代码是自适应平均池化,它通过裁剪或插值方式使每张图像的每个通道都变成 3*3 大小
img = nn.AdaptiveAvgPool2d((3, 3))(img)
print(img.shape)
# 还有一些自适应平均池化方法,请查阅文档
扁平层
# 把二维特征扁平化,使每张图像都变成一个向量
img = nn.Flatten()(img)
print(img.shape)