神经网络入门

前言

通常构建一个神经网络,有如下步骤
1、构建好网络模型
2、参数初始化
3、前向传播
4、计算损失
5、反向传播求出梯度
6、更新权重
以下是快速搭建法(Variable、Sequential、nn)完成的一个自定义两层感知机模型

多层感知机.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import torch
from torch.autograd import Variable
import torch.nn as nn

# 一定要继承 nn.Module
class TwoLayerNet(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(TwoLayerNet, self).__init__()
"""
我们在构建模型的时候,能够使用nn.Sequential的地方,尽量使用它,因为这样可以让结构更加清晰
"""
self.twolayernet = nn.Sequential(
nn.Linear(input_size, hidden_size),
nn.ReLU(),
nn.Linear(hidden_size, output_size),
)

def forward(self, x):
"""
在forward函数中,我们会接受一个Variable,然后我们也会返回一个Varible
"""
y_pred = self.twolayernet(x)
return y_pred


# M是样本数量,input_size是输入层大小
# hidden_size是隐含层大小,output_size是输出层大小
M, input_size, hidden_size, output_size = 64, 1000, 100, 10

# 生成随机数当作样本,同时用Variable 来包装这些数据,设置 requires_grad=False 表示在方向传播的时候,
# 我们不需要求这几个 Variable 的导数
x = Variable(torch.randn(M, input_size))
y = Variable(torch.randn(M, output_size))

model = TwoLayerNet(input_size, hidden_size, output_size)

# 定义损失函数
loss_fn = nn.MSELoss(size_average=False)

## 设置超参数 ##
learning_rate = 1e-4
EPOCH = 300

# 使用optim包来定义优化算法,可以自动的帮我们对模型的参数进行梯度更新。这里我们使用的是随机梯度下降法。
# 第一个传入的参数是告诉优化器,我们需要进行梯度更新的Variable 是哪些,
# 第二个参数就是学习速率了。
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)

## 开始训练 ##
for t in range(EPOCH):
# 向前传播
y_pred = model(x)

# 计算损失
loss = loss_fn(y_pred, y)

# 显示损失
if (t + 1) % 50 == 0:
print(loss.data[0])

# 在我们进行梯度更新之前,先使用optimier对象提供的清除已经积累的梯度。
optimizer.zero_grad()

# 计算梯度
loss.backward()

# 更新梯度
optimizer.step()