1、卷积神经网络基础
1.1卷积层
现在我要识别一个带数字的图像(比如是3),得到其中的数字是几,考虑:把0—9分别跟图像对照,得到一组概率,概率最大的对应数字就是结果,这组概率是如何计算的呢?这就涉及到了特征值与特征提取。
数学层面的思考:
对于全连接网络,权值过多,计算慢,难收敛,同时可能进入局部极小值,也容易产生过拟合问题,为解决该问题,使用局部连接网络,在上层提取特征的基础上获取进行再处理,得到更高级别的特征。
计算卷积:有两个已知量:图像的二维矩阵(图中蓝色)和卷积核(深蓝色),作卷积(对应位置数值相乘后再相加),按步长(图中为2)运算,得到一个二维矩阵(绿色)。可以看到,五阶阵变为了二阶阵。
在这种计算中,中间的部分会比边缘值计算更多次,因此通常用0或者复制边界像素来进行填充,保证计算的“公平”。
1.2池化层
为进一步解决特征值过多问题,引入池化层,如下图:把这个4阶阵分成4部分,每块取本区域的最大值,这种计算的本质是进一步得到更符合的特征值。还可以取区域内平均值作为结果。
1.3 BP算法
将全连接网络与卷积层、池化层结合,如下图,针对文章识别数字的问题,经过两次卷积和最大池化之后,得到最后的特征图,此时的特征都是经过计算后得到的,所以代表性比较强,最后经过全连接层,展开为一维的向量,再经过一次计算后,得到最终的识别概率,这就是卷积神经网络的整个过程。
对于卷积层和池化层,再次推导BP算法,得到结果:
机器学习(十三)卷积神经网络(CNN)详细公式推导_cnn卷积神经数学公式-CSDN博客
2、LeNet-5网络
C1卷积层:经过(5*5*1)*6卷积核,6为滤波器的数量,stride=1,生成特征图为28*28*6。输入的图像是一个单通道的图像,所以这里特征图的数量,就等于卷积核的数量,每一个输入通道都与输入通道相连。C1层包含了156个可训练的参数,122304个连接。
S2池化层:这是一个(2*2)的采样核,stride=2,生成特征图为(14*14*6),这里的池化层虽然没有卷积核,但是也有训练参数,即偏移量。所以包含12个训练参数,5880个连接。
C3卷积层:经过(5*5*6)*16卷积核,stride=1,生成特征图为10*10*16.输入是6个通道,输出是16个通道。编码表如上面连接表所示。C3层总共包含了1516个可训练数据,151600个连接。
S4池化层:经过(2*2)采样核,stride=2,生成特征图为5*5*16。S4有32个可训练参数,2000个连接。
C5全连接层:经过(5*5*16)*120卷积核,stride=1,生成特征图为1*1*120,这就是一个全连接层了,所以输出的每一个通道都会跟输入的所有通道相连。C5层有48120个可训练数据。
F6全连接层:输入为1*1*120,输出为1*1*84,总参数量为120*84。
import torch.nn as nn
class LeNet5(nn.Module):
def __init__(self):
super(LeNet5, self).__init__()
# 1 input image channel, 6 output channels, 5x5 square convolution
# kernel
self.conv1 = nn.Conv2d(1, 6, 5)
self.conv2 = nn.Conv2d(6, 16, 5)
# an affine operation: y = Wx + b
self.fc1 = nn.Linear(16 * 5 * 5, 120) # 这里论文上写的是conv,官方教程用了线性层
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
# Max pooling over a (2, 2) window
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
# If the size is a square you can only specify a single number
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
x = x.view(-1, self.num_flat_features(x))
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
def num_flat_features(self, x):
size = x.size()[1:] # all dimensions except the batch dimension
num_features = 1
for s in size:
num_features *= s
return num_features
net = LeNet5()
print(net)
===========================================================
LeNet5(
(conv1): Conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))
(conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
(fc1): Linear(in_features=400, out_features=120, bias=True)
(fc2): Linear(in_features=120, out_features=84, bias=True)
(fc3): Linear(in_features=84, out_features=10, bias=True)
)
LeNet-5一些特点:
3、基本卷积神经网络
网络结构:
特点:
(5)dropout 防止过拟合,提高泛化能力
使用了 Dropout 技巧随机忽略一部分神经元,缓解了神经网络的过拟合现象,和防止对网络参数优化时陷入局部最优的问题,该网络是利用 Dropout 在训练过程中将输入层和中间层的一些神经元随机置零,使得训练过程收敛的更慢,但得到的网络模型更加具有鲁棒性。