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)组成

2d卷积神经网络 卷积神经网络卷积_池化

2. 卷积神经网络的组成

2.1 卷积层

  • 卷积层是卷积神经网络的核心所在,通过卷积运算,达到降维处理和提取特征两个重要目的

2.2 激活层

  • 激活层的作用在于将前一层的线性输出,通过非线性的激活函数进行处理,这样用以模拟任意函数,从而增强网络的表征能力。
  • 激活层常用的函数包括Sigmoid和ReLU(Rectified-Linear Unit,修正线性单元)等。

2d卷积神经网络 卷积神经网络卷积_2d卷积神经网络_02

2.3 池化层

  • 池化层称子采样层或下采样层(Subsampling Layer),作用是降低计算量,提高泛化能力。如下的示例,将44的矩阵缩小成22的矩阵输出

2d卷积神经网络 卷积神经网络卷积_深度学习_03

2.5 全连接层

  • 这个网络层相当于多层感知机(Multi-Layer Perceptron,简称MLP),其在整个卷积神经网络中起到分类器的作用
  • 通过前面多个“卷积-激活-池化”层的反复处理,待处理的数据特性已有了显著提高
  1. 输入数据的维度已下降到可用传统的前馈全连接网络来处理了
  2. 全连接层输入的数据经过反复提纯过的结果,因此输出的分类品质要高得多

2.6 LeNet5的网络结构

  • LeNet5是Yann LeCun在1998年提出,用于解决手写数字识别的视觉任务。自那时起,CNN的最基本的架构就定下来了:卷积层、池化层、全连接层

2d卷积神经网络 卷积神经网络卷积_2d卷积神经网络_04

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