Torch搭建简单神经网络y=x^2(三)

目录

.1构建数据点集

.2搭建简单的神经网络

2.1网络构造

2.2网络推理

2.2.1定义前向传播

2.2.2定义激活函数

2.2.3先是实例化网络

2.2.4定义一个优化器

 2.2.5定义损失函数

 .3训练数据集分析结果

3.1训练过程

3.1.1定义训练次数

3.1.2输出预测结果

3.1.3 输出损失值

3.1.4 优化器设置

3.2 可视化训练过程


.1构建数据点集

在搭建神经网络之间我们需要明确数据集是什么,训练的目的是什么

下图第一个数据集是手写数字,第二个是行驶的车辆,第三个是语义分割的数据集

最后的希望的结果是 

目标是看到y=x^ 2的图像

制作的数据集是一系列含有噪声的而二维数据在y=x^ 2周围

import torch
import torch.nn.functional as f

import matplotlib.pyplot as plt
import matplotlib;matplotlib.use('TkAgg')

x=torch.unsqueeze(torch.linspace(-1,1,100),dim=1)
y=x.pow(2)+0.2*torch.rand(x.size())

plt.scatter(x.data.numpy(),y.data.numpy())
plt.show()

 以下为加了噪声的散点图

.2搭建简单的神经网络

2.1网络构造

有了数据集之后,就可以开始搭建网络

可以直接用torch内置的模版

class Net(torch.nn.Module):

然后定义构造方法;

输入,隐藏层,输出都内置为参数

class Net(torch.nn.Module):
    def __init__(self,n_feature,n_hiddenn_out) -> None:

然后继承一下父类

class Net(torch.nn.Module):
    def __init__(self,n_feature,n_hiddenn_out) -> None:
        super().__init__()

定义一下隐藏层:

 self.hidden=torch.nn.Linear(n_feature,n_hidden)

再定义输出层:

self.predict=torch.nn.Linear(n_hidden,n_output)

至此就完成了简单的网络构造

2.2网络推理

2.2.1定义前向传播

 def forward(self,x):

2.2.2定义激活函数

 x=f.relu(self.hidden(x))

这样就有非线性特征

然后将激活后的值传入预测层

 x=self.predict(x)

返回预测值

 return x

完整网络:

class Net(torch.nn.Module):
    def __init__(self,n_feature,n_hidden,n_output) -> None:
        super().__init__()
        self.hidden=torch.nn.Linear(n_feature,n_hidden)
        self.predict=torch.nn.Linear(n_hidden,n_output)
    
    def forward(self,x):
        x=f.relu(self.hidden(x))
        x=self.predict(x)
        return x

有了网络之后就可以对其进行训练:

2.2.3先是实例化网络

net = Net(1,10,1)

一个输入,隐藏层10个神经元,1个输出

然后可以打印net

print(net)

2.2.4定义一个优化器

optimizer=torch.optim.SGD(net.parameters(),lr=0.2)

 2.2.5定义损失函数

loss_func=torch.nn.MSELoss()

初始参数是随机的,也可以打印

print(net.parameters())

完整编码:

net = Net(1,10,1)
# print(net)

optimizer=torch.optim.SGD(net.parameters(),lr=0.2)
loss_func=torch.nn.MSELoss()
# print(net.parameters())

 .3训练数据集分析结果

3.1训练过程

然后开始训练

3.1.1定义训练次数

训练500次

for t in range(500):

开始训练过程

3.1.2输出预测结果

让x依次传入网络乘以参数输出一个随机结果

    prediction=net.forward(x)

3.1.3 输出损失值

    loss=loss_func(prediction,y)

实际上就是预测值和真实值之间的差距

对应x传入网络输出的值和真实的y值(和x一一对应的值)之间的损失

3.1.4 优化器设置

把优化器梯度归零

optimizer.zero_grad()

然后反向传播

    loss.backward()

然后迭代模型更新

    optimizer.step()

完整编码:

for t in range(500):
    prediction=net.forward(x)
    loss=loss_func(prediction,y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    

3.2 可视化训练过程

每五次显示一次训练结果

if t%5==0:

输出预测结果和原始数据之间的差距:


        plt.cla()
        plt.scatter(x.data.numpy(),y.data.numpy())
        plt.plot(x.data.numpy(),prediction.data.numpy(),'r-',lw=5)

打印损失值

        print('loss=:',loss.data)
        plt.pause(0.1)

然后可视化

plt.ioff()
plt.show()

运行效果图

 

 可以看到效果不断变好

loss也是不断变小

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值