2019 第 43 篇,总第 67 篇文章
本文大约 4600 字,阅读大约需要 10 分钟
快速入门 PyTorch 教程第二篇,这篇介绍如何构建一个神经网络。上一篇文章:
本文的目录:

3. 神经网络
在 PyTorch 中 torch.nn
专门用于实现神经网络。其中 nn.Module
包含了网络层的搭建,以及一个方法-- forward(input)
,并返回网络的输出 outptu
.
下面是一个经典的 LeNet 网络,用于对字符进行分类。

对于神经网络来说,一个标准的训练流程是这样的:
定义一个多层的神经网络
对数据集的预处理并准备作为网络的输入
将数据输入到网络
计算网络的损失
反向传播,计算梯度
更新网络的梯度,一个简单的更新规则是
weight = weight - learning_rate * gradient
3.1 定义网络
首先定义一个神经网络,下面是一个 5 层的卷积神经网络,包含两层卷积层和三层全连接层:
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# 输入图像是单通道,conv1 kenrnel size=5*5,输出通道 6
self.conv1 = nn.Conv2d(1, 6, 5)
# conv2 kernel size=5*5, 输出通道 16
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):
# max-pooling 采用一个 (2,2) 的滑动窗口
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
# 核(kernel)大小是方形的话,可仅定义一个数字,如 (2,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)