
1.2.1 定义神经网络
在PyTorch中,torch.nn是专门为神经网络设计的模块化接口,nn库构建于autograd(在PyTorch中为Tensor所有操作提供自动微分)之上,可以用来定义和运行神经网络。nn.Module是nn库中十分重要的类,包含网络各层的定义及forward函数。PyTorch允许定义自己的神经网络,但需要继承nn.Module类,并实现forward函数。只要在nn.Module的子类中定义forward函数, backward函数就会被自动实现(利用autograd),一般把神经网络中具有可学习参数的层放在构造函数__init__中,而不具有可学习参数的层(如ReLU),可放在构造函数中,也可不放在构造函数中。下面的代码就是大概的框架。

本小节针对MNIST数据集,我们构建一个简单的图像识别网络,该网络结构如图1-3所示。

图1-3 网络结构
这是一个简单的前馈神经网络,其中Convolutions 是卷积操作,Subsampling 是下采样操作,也就是池化,Full connection 表示全连接层,Gaussian Connections是进行了欧式径向基函数(Euclidean Radial Basis Function)运算并输出最终结果。它将输入的图片,经过两层卷积和池化,再经过三层全连接,最后输出我们想要的概率值。代码如下:


输出结果如下:

首先把该网络取名为Net,再继承nn.Module类,在初始化函数中定义了卷积和全连接。卷积利用的函数是nn.Conv2d,它接收三个参数,即输入通道、输出通道和核大小。由于MNIST是黑白数据集,所以只有一个颜色的通道,如果是其他彩色数据集(如CIFAR或者自定义的彩色图片),则有R、G、B三个通道。所以最开始的输入为1,核大小定义为5,输出定义为6,代表6个特征提取器提取出6份不同的特征。全连接层又叫Full-connected Layer或者Dense Layer,在PyTorch中通过nn.Linear函数来实现,是一个常用来做维度转换的层,接收两个参数,即输入维度和输出维度。初始化卷积和全连接后,我们在forward函数中定义前向传播,当输入变量x时,F.max_pool2d(F.relu(self.conv1(x)), (2, 2))先输入第一层卷积,为了增加非线性表征,在卷积后加入一层ReLU层,再调用F中的max_pool2d函数定义窗口大小为(2,2)进行池化,得到新的x。以此类推,将x输入接下来的网络结构中。