1. 卷积神经网络的概念
1.1 卷积神经网络
-
卷积神经网络(Convolutional Neural Network,CNN)针对全连接网络的局限做出了修正,加入了卷积层(Convolution层)和池化层(Pooling层)。
-
CNN被广泛应用于图像识别、语音识别等各种场合,在图像识别的比赛中,基于深度学习的方法几乎都以CNN为基础(比如,AlexNet、VGGNet、Google Inception Net及微软的ResNet等)上。
1.2 卷积神经网络结构
- 通常情况下,卷积神经网络由若干个卷积层(Convolutional Layer)、激活层(Activation Layer)、池化层(Pooling Layer)及全连接层(Fully Connected Layer)组成
2. 卷积神经网络的组成
2.1 卷积层
- 卷积层是卷积神经网络的核心所在,通过卷积运算,达到降维处理和提取特征两个重要目的
2.2 激活层
- 激活层的作用在于将前一层的线性输出,通过非线性的激活函数进行处理,这样用以模拟任意函数,从而增强网络的表征能力。
- 激活层常用的函数包括Sigmoid和ReLU(Rectified-Linear Unit,修正线性单元)等。
2.3 池化层
- 池化层称子采样层或下采样层(Subsampling Layer),作用是降低计算量,提高泛化能力。如下的示例,将44的矩阵缩小成22的矩阵输出
2.5 全连接层
-
这个网络层相当于多层感知机(Multi-Layer Perceptron,简称MLP),其在整个卷积神经网络中起到分类器的作用
-
通过前面多个“卷积-激活-池化”层的反复处理,待处理的数据特性已有了显著提高
-
输入数据的维度已下降到可用传统的前馈全连接网络来处理了
-
全连接层输入的数据经过反复提纯过的结果,因此输出的分类品质要高得多
-
2.6 LeNet5的网络结构
- LeNet5是Yann LeCun在1998年提出,用于解决手写数字识别的视觉任务。自那时起,CNN的最基本的架构就定下来了:卷积层、池化层、全连接层
2.3 代码
- 步骤一:导入工具包
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable
- 步骤二:构建网络模型
class Net(nn.Module):
def __init__(self):
# 使用super()方法调用基类的构造器,即nn.Module.__init__(self)
super(Net, self).__init__()
# 1 输入通道 ,6 输出通道,5x5 卷积核
self.conv1 = nn.Conv2d(1, 6, 5)
# 6 输入通道,16 输出通道,5x5 square convolution kernel
self.conv2 = nn.Conv2d(6, 16, 5)
# 全连接层
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
# x是网络的输入,然后将x前向传播,最后得到输出
# 下面两句定义了两个2x2的池化层
# o = (h+ 2p-fh)/s + 1 = (32-5)/2 + 1 = 14
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
# 最大池化
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:]
num_features = 1
for s in size:
num_features *= s
return num_features
- 步骤三:查看模型结构
def main():
# 查看模型结构
net = Net()
print(net)
# 前向计算过程
print("+++++++++")
_input = Variable(torch.randn(10, 1, 32, 32))
out = net(_input)
print(out)
if __name__ == '__main__':
main()