PyTorch学习笔记(四)——回归问题

这次来见证神经网络是如何通过简单的形式将一群数据用一条线条来表示。或者说,是如何在数据当中找到他们的关系, 然后用神经网络模型来建立一个可以代表他们关系的线条。注:本节程序上下是连贯的,分开只为方便解说。

一、建立伪数据:

# coding=gbk
import torch
import matplotlib.pyplot as plt
#建立伪数据集
x = torch.unsqueeze(torch.linspace(-1,1,100),dim=1)
#torch.unsqueeze将数据变为二维数据,满足神经网络的条件
y = x.pow(2) + 0.2*torch.rand(x.size())    #给y加一点噪声,data (tensor), shape=(100, 1)

#画图,注意只有Numpy格式的数据能画出来。
plt.scatter(x.data.numpy(), y.data.numpy())
plt.show()

伪数据可视化:

二、建立神经网络:

建立一个神经网络可以直接运用 torch 中的体系。先定义所有的层属性(__init__()), 然后再一层层搭建(forward(x))层于层的关系链接。建立关系的时候, 会用到上一期介绍的激励函数。

#建立神经网络
class Net(torch.nn.Module):  # 继承 torch 的 Module
    def __init__(self, n_feature, n_hidden, n_output):
        super(Net, self).__init__()     # 继承 __init__ 功能
        # 定义每层用什么样的形式
        self.hidden = torch.nn.Linear(n_feature, n_hidden)   # 隐藏层线性输出
        self.predict = torch.nn.Linear(n_hidden, n_output)   # 输出层线性输出

    def forward(self, x):   # 这同时也是 Module 中的 forward 功能
        # 正向传播输入值, 神经网络分析出输出值
        x = torch.relu(self.hidden(x))      # 激励函数(隐藏层的线性值)
        x = self.predict(x)             # 输出值
        return x

net = Net(n_feature=1, n_hidden=10, n_output=1)
print(net)  # net的结构
"""
输出网络结构:
Net(
  (hidden): Linear(in_features=1, out_features=10, bias=True)
  (predict): Linear(in_features=10, out_features=1, bias=True)
)
"""

三、训练神经网络:

注意参数、优化器的选择。

#训练神经网络
# optimizer 是训练的工具
optimizer = torch.optim.SGD(net.parameters(), lr=0.2)  
# 传入net的所有参数, 学习率,优化器使用随机梯度下降。
loss_func = torch.nn.MSELoss()      # 预测值和真实值的误差计算公式 (均方差)

for t in range(100): #训练100次
    prediction = net(x)     #喂给net训练数据x,输出预测值

    loss = loss_func(prediction, y)     #计算两者的误差,注意顺序不要反了

    optimizer.zero_grad()   # 清空上一步的残余更新参数值
    loss.backward()         # 误差反向传播, 计算参数更新值
    optimizer.step()        # 将参数更新值施加到 net 的 parameters 上

四、可视化训练过程:

在运行代码时,将第三段的训练神经网络覆盖,因为此处包含第三个步骤。

#可视化训练过程
for t in range(2000):
    prediction = net(x)     # 喂给net训练数据x,输出预测值
    loss = loss_func(prediction, y)     # 计算两者的误差,注意顺序不要反了
    optimizer.zero_grad()   # 清空上一步的残余更新参数值  
    loss.backward()
    optimizer.step()
    # 接着上面来
    if t % 5 == 0:#训练5次打印一次
        # plot and show learning process
        plt.cla()
        plt.scatter(x.data.numpy(), y.data.numpy())
        plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
        plt.text(0.5, 0, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color':  'red'})
        plt.pause(0.1)
plt.ion()   #画图
plt.show()

完整代码:

# coding=gbk
import torch
import matplotlib.pyplot as plt
#建立伪数据集
x = torch.unsqueeze(torch.linspace(-1,1,100),dim=1)
#torch.unsqueeze将数据变为二维数据,满足神经网络的条件
y = x.pow(2) + 0.2*torch.rand(x.size())    #给y加一点噪声,data (tensor), shape=(100, 1)

#画图,注意只有Numpy格式的数据能画出来。
#plt.scatter(x.data.numpy(), y.data.numpy())
#plt.show()

#建立神经网络
import torch
import torch.nn.functional as F     # 激励函数都在这

class Net(torch.nn.Module):  # 继承 torch 的 Module
    def __init__(self, n_feature, n_hidden, n_output):
        super(Net, self).__init__()     # 继承 __init__ 功能
        # 定义每层用什么样的形式,以上三行是必须要的。
        self.hidden = torch.nn.Linear(n_feature, n_hidden)   # 隐藏层线性输出
        self.predict = torch.nn.Linear(n_hidden, n_output)   # 输出层线性输出

    def forward(self, x):   # 这同时也是 Module 中的 forward 功能
        # 正向传播输入值, 神经网络分析出输出值
        x = torch.relu(self.hidden(x))      # 激励函数(隐藏层的线性值)
        x = self.predict(x)             # 输出值
        return x

net = Net(n_feature=1, n_hidden=10, n_output=1)

print(net)  # net 的结构
"""
输出网络结构:
Net(
  (hidden): Linear(in_features=1, out_features=10, bias=True)
  (predict): Linear(in_features=10, out_features=1, bias=True)
)
"""
#训练神经网络
# optimizer 是训练的工具
optimizer = torch.optim.SGD(net.parameters(), lr=0.1)  
# 传入net的所有参数, 学习率,优化器使用随机梯度下降。
loss_func = torch.nn.MSELoss()      # 预测值和真实值的误差计算公式 (均方差)

#for t in range(100): #训练100次
    #prediction = net(x)     #喂给net训练数据x,输出预测值

    #loss = loss_func(prediction, y)     #计算两者的误差,注意顺序不要反了

    #optimizer.zero_grad()   # 清空上一步的残余更新参数值
    #loss.backward()         # 误差反向传播, 计算参数更新值
    #optimizer.step()        # 将参数更新值施加到 net 的 parameters 上
    
#可视化训练过程
for t in range(2000):
    prediction = net(x)     # 喂给net训练数据x,输出预测值
    loss = loss_func(prediction, y)     # 计算两者的误差,注意顺序不要反了
    optimizer.zero_grad()   # 清空上一步的残余更新参数值  
    loss.backward()
    optimizer.step()
    # 接着上面来
    if t % 5 == 0:#训练5次打印一次
        # plot and show learning process
        plt.cla()
        plt.scatter(x.data.numpy(), y.data.numpy())
        plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
        plt.text(0.5, 0, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color':  'red'})
        plt.pause(0.1)
plt.ion()   #画图
plt.show()

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Pytorch是机器学习中的一个重要框架,它与TensorFlow一起被认为是机器学习的两大框架。Pytorch学习可以从以下几个方面入手: 1. Pytorch基本语法:了解Pytorch的基本语法和操作,包括张量(Tensors)的创建、导入torch库、基本运算等\[2\]。 2. Pytorch中的autograd:了解autograd的概念和使用方法,它是Pytorch中用于自动计算梯度的工具,可以方便地进行反向传播\[2\]。 3. 使用Pytorch构建一个神经网络学习使用torch.nn库构建神经网络的典型流程,包括定义网络结构、损失函数、反向传播和更新网络参数等\[2\]。 4. 使用Pytorch构建一个分类器:了解如何使用Pytorch构建一个分类器,包括任务和数据介绍、训练分类器的步骤以及在GPU上进行训练等\[2\]。 5. Pytorch的安装:可以通过pip命令安装Pytorch,具体命令为"pip install torch torchvision torchaudio",这样就可以在Python环境中使用Pytorch了\[3\]。 以上是一些关于Pytorch学习笔记,希望对你有帮助。如果你需要更详细的学习资料,可以参考引用\[1\]中提到的网上帖子,或者查阅Pytorch官方文档。 #### 引用[.reference_title] - *1* [pytorch自学笔记](https://blog.csdn.net/qq_41597915/article/details/123415393)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Pytorch学习笔记](https://blog.csdn.net/pizm123/article/details/126748381)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Le_ander

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值