No.1 用到的库
NumPy:构造样本时用到
PyTorch:构造神经网络时用到
matlpotlib:可视化显示动态拟合的过程
No.2 绘制一条曲线的散点图
以y=cosx为例
import numpy as np # 引入numpy模块
import torch # 引入torch模块
import torch.nn as nn
import matplotlib.pyplot as plt #引入matplotlib模块
x = torch.unsqueeze(torch.linspace(- np.pi, np.pi, 100), dim=1) # 构建等差数列
y = torch.cos(x) + 0.5 * torch.rand(x.size()) # 添加随机数
plt.scatter(x,y)
plt.show()
No.3 构建网络并训练网络
1.构造网络:用类的方式来构建该网络,并用类定义了前向传播过程。采用隐藏节点数为10的隐含层,此处选择ReLU函数作为激活函数。
2.训练网络:采用SGD算法优化,以MSE为损失函数,并使用plt.ion()动态显示训练过程
#构建网络
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.predict = nn.Sequential( # nn模块搭建网络
nn.Linear(1, 10), # 全连接层,1个输入10个输出
nn.ReLU(), # ReLU激活函数
nn.Linear(10, 1) # 全连接层,10个输入1个输出
)
def forward(self, x): # 定义前向传播过程
prediction = self.predict(x) # 将x传入网络
return prediction # 返回预测值
#训练网络
net = Net()
optimizer = torch.optim.SGD(net.parameters(), lr=0.05) # 设置优化器
loss_func = nn.MSELoss() # 设置损失函数
plt.ion() # 打开交互模式
for epoch in range(1000): # 训练部分
out = net(x) # 实际输出
loss = loss_func(out, y) # 实际输出和期望输出传入损失函数
optimizer.zero_grad() # 清除梯度
loss.backward() # 误差反向传播
optimizer.step() # 优化器开始优化
if epoch % 25 == 0: # 每25epoch显示
plt.cla() # 清除上一次绘图
plt.scatter(x, y) # 绘制散点图
plt.plot(x, out.data.numpy(), 'r', lw=5) # 绘制曲线图
plt.text(0.5, 0, f'loss={loss}', fontdict={'size': 20, 'color': 'red'}) # 显示loss值
plt.pause(0.1) # 显示时间0.1s
plt.show()
plt.ioff() # 关闭交互模式
plt.show() # 定格显示最后结果
训练过程: