1.1 线性回归 - pytorch

看 pytorch 教程抄的代码。添加了少量汉语注释。

代码如下:

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
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt


# Hyper-parameters 超参数设置
input_size = 1 #输入数据的特征维度
output_size = 1 #输出维度
num_epochs = 60 #训练的轮数
learning_rate = 0.001 #学习率,决定每次参数更新时权重参数变化幅度


#Toy dataset -> toy是微型模型的意思.
#使用小型数据集可以验证算法实现是否正确以及调试超参数
x_train = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168],
[9.779], [6.182], [7.59], [2.167], [7.042],
[10.791], [5.313], [7.997], [3.1]], dtype=np.float32) # 1 x 15 矩阵
y_train = np.array([[1.7], [2.76], [2.09], [3.19], [1.694], [1.573],
[3.366], [2.596], [2.53], [1.221], [2.827],
[3.465], [1.65], [2.904], [1.3]], dtype=np.float32) # 1 x 15 矩阵


# Linear regression model 建立线性回归模型
model = nn.Linear(input_size, output_size)


# Loss and optimizer 设置损失函数和优化器
criterion = nn.MSELoss() #损失函数用于度量误差,进而优化参数
optimizer = torch.optim.SGD(model.parameters(), lr = learning_rate)
#根据loss的梯度值来更新参数,其中 model.parameters() 用于调取模型中的所有参数,可以 print 查看


# Train the model
for epoch in range(num_epochs): #epoch对应深度学习中的一次迭代
#convert numpy arrays to torch tensors 张量转化
inputs = torch.from_numpy(x_train)
targets = torch.from_numpy(y_train)

#Forward pass 前向传递
outputs = model(inputs)
loss = criterion(outputs, targets)

#Backward and optimize 后向传递
optimizer.zero_grad() #清零/重置梯度
loss.backward() #后向传递,计算新梯度
optimizer.step() #更新权重

if (epoch + 1) % 5 == 0 : #每 5 个 epoch 打印一次当前 loss
print('Epoch [{}/{}], Loss:{:.4f}'.format(epoch + 1, num_epochs, loss.item()))


# Plot the graph
predicted = model(torch.from_numpy(x_train)).detach().numpy()
#前向传递得到预测结果 -> 从计算图中分离 -> 转成 numpy 数组
plt.plot(x_train, y_train, 'ro', label = 'Original data') #绘制散点图,ro指红色圆点
plt.plot(x_train, predicted, label = 'Fitted line') #绘制线图
plt.legend() #显示图例
plt.show()


# Save the model checkpoint 保存模型数据
torch.save(model.state_dict(), 'model.ckpt')