卷积神经网络由一个或多个卷积层和顶端的全连通层组成,同时也包括关联权重和池化层。与其他深度学习结构相比,卷积神经网络在图像和语音识别方面能够给出更好的结果,且考量的参数更少。
卷积神经网络的运作,以图像识别举例: 神经网络有输入输出值,当输入值是图片时,实际输入的并不是我们肉眼看到的图案,而是只能被计算机识别的一堆数字。卷积神经网络有一个批量过滤器,持续不断地在图片上滚动收集图片里的信息,每一次收集的时候都只是收集一小块像素区域,然后把收集来的信息进行整理,这时候整理出来的信息有了一些实际上的呈现。这时就不再是对每个像素的输入信息做处理,而是对图片上每一小块像素区域进行处理,加强了图片信息的连续性,使得神经网络能看到图形而非一个点。
下面是来自官方文档的图片:
声明一个类,并继承自 nn.Module
定义构造函数,例如用于分类的网络
初始化方法(使用父类的方法即可)
最后定义自己的前向传播函数
举个例子:
class MyNet(nn.Module): def __init__(self): super(MyNet, self).__init__() self.conv1 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5, padding=1) def forward(self,x): out = self.conv1(x) return out构建一个输入通道为6,输出通道为16,卷积核大小为5x5,四周进行1个像素点的零填充的conv1层
最大值池化 nn.MaxPool2d() 和均值池化 nn.AvgPool2d()
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False) torch.nn.AvgPool2d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True) kernel_size、stride、padding、dilation与卷积层定义一致return_indices:表示是否返回最大值的下标,默认为 Falseceil_mode:默认为 False,即不使用方格代替层结构count_include_pad:默认为 True,表示包含零填充举个例子:
class MyNet(nn.Module): def __init__(self): super(MyNet, self).__init__() self.conv1 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5, padding=1) self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2) def forward(self,x): #定义自己的前向传播方式 out = self.conv1(x) out = self.pool1(out) return out构建一个卷积核大小为2x2,步长为2的pool1层
举个例子:
class MyNet(nn.Module): def __init__(self): super(MyNet, self).__init__() self.conv1 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5, padding=1) self.BN1 = nn.BatchNorm2d(16) self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2) def forward(self,x): out = self.conv1(x) out = self.BN1(out) out = self.pool1(out) return out构建一个输入通道为16的BN1层,与卷积层输出通道数16对应
常用的激活函数:
import torch.nn.functional as F F.relu() F.sigmoid() F.tanh() F.softplus()y = x A T + b y = xA^T+b y=xAT+b
随机将输入张量中部分元素设置为0。对于每次前向调用,被置0的元素都是随机的。
具体实例可以看这篇文章:PyTorch手写数字识别(MNIST数据集)