池化(pooling)是对图片进行压缩(降采样)的一种方法,池化的方法有很多,如max pooling、average pooling等。
池化层也有操作参数,我们假设输入图像为W1*H1*D1(字母分别表示图像的宽、高、channel),池化层的参数中,池化kernel的大小为F*F,步长为S,那么经过池化后输出的图像的宽、高、channel分别为:
通常情况下F=2,S=2。一个4*4的特征层经过池化filter=2*2,stride=2的最大池化操作后可以得到一个2*2的特征层。
池化层对原始特征层的信息进行压缩,是卷积神经网络中很重要的一步。
我们将会看到在绝大多数情况下,卷积层、池化层、激活层三者几乎像一个整体一样常常共同出现。
下面给出PyTorch定义卷积神经网络的代码(这里只是初步介绍,更详细的代码将在后面中给出):
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self): #在这里定义卷积神经网络需要的元素
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5) #定义第一个卷积层
self.pool = nn.MaxPool2d(2, 2) #池化层
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) #最后一个全连接层用作10分类
def forward(self, x): #使用__init__中的定义,构建卷积神经网络结构
x = self.pool(F.relu(self.conv1(x))) #第一个卷积层首先要经过ReLU做激活,然后使用前面定义好的nn.Max Pool2d(2, 2)方法做池化
x = self.pool(F.relu(self.conv2(x))) #第二个卷积层也要经过ReLU做激活,然后使用前面定义好的nn.MaxPool2d(2, 2)方法做池化
x = x.view(-1, 16 * 5 * 5) #对特征层Tensor维度进行变换
x = F.relu(self.fc1(x)) #卷积神经网络的特征层经过第一次全连接层操作,然后再通过ReLU层激活
x = F.relu(self.fc2(x)) #卷积神经网络的特征层经过第二次全连接层操作,然后再通过ReLU层激活
x = self.fc3(x) #卷积神经网络的特征层经过最后一次全连接层操作,得到最终要分类的结果(10分类标签)
return x
net = Net()
网友评论