如何用神经网络去拟合一条曲线?

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()

如何用神经网络去拟合一条曲线?_第1张图片

 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()  # 定格显示最后结果

训练过程:

如何用神经网络去拟合一条曲线?_第2张图片

 

你可能感兴趣的:(神经网络)