python3+pytorch之关系拟合(回归)

本文介绍如何使用神经网络实现数据回归,通过一个简单的实例演示了如何建立神经网络模型,并利用PyTorch框架完成训练过程,最终得到能够拟合一元二次函数的数据模型。
部署运行你感兴趣的模型镜像

zhuanzaizi:     https://www.imooc.com/article/24300?block_id=tuijian_wz

这个小节呢就是见证或者说学习神经网络是如何通过简单的形式将一群数据用一条线来表示,也就是说,在一堆数据中如何找到他们之间的关系,然后用神经网络模型来建立一个可以代表他们关系的线条。至于机器学习中分类器和回归的概念呢,这里就不做阐述,可以参见优快云链接链接描述

  1. torch中的变量Variable

在开始之前,有必要说明一下什么是variable。在torch中的variable就是一个存放会变化的值的地理位置,里面的值会不停的变化,好比一个书架存放一些书,书架不会动,但是书架上的书的数目是会一直变化的。如果用一个 Variable 进行计算, 那返回的也是一个同类型的 Variable。下面举例说明一下:

import torch
from torch.autograd import Variable  # torch 中 Variable 模块

# 先买书
tensor = torch.FloatTensor([[1,2],[3,4]])
# 把书放到书架里
variable = Variable(tensor)
print(variable)     #  Variable 形式
"""
Variable containing:
 1  2
 3  4
[torch.FloatTensor of size 2x2]
"""

print(variable.data)    # tensor 形式
"""
 1  2
 3  4
[torch.FloatTensor of size 2x2]
"""

print(variable.data.numpy())    # numpy 形式
"""
[[ 1.  2.]
 [ 3.  4.]]
"""
  1. 关系拟合(回归)
import torch
from torch.autograd import Variable
import matplotlib.pyplot as plt
import torch.nn.functional as tf

#建立数据集
#创建假数据来模拟真实的情况,这里是一个一元二次函数:y = a*x^2 + b,同时给y数据加一点噪声来更真实的展示
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)
y = x.pow(2) + 0.2*torch.rand(x.size())

#用variable来修饰这些tensor数据
x, y = torch.autograd.Variable(x), Variable(y)

#可以先画图瞄一眼
#plt.scatter(x.data.numpy(), y.data.numpy())
#plt.show()

#建立神经网络
class Net(torch.nn.Module):
    def __init__(self, n_feature, n_hidden, n_output):
        super(Net, self).__init__()
         # 定义每层用什么样的形式
        self.hidden = torch.nn.Linear(n_feature, n_hidden)
        self.predict = torch.nn.Linear(n_hidden, n_output)

    def forward(self, x):
         # 正向传播输入值, 神经网络分析出输出值
        x = tf.relu(self.hidden(x))  # 激励函数(隐藏层的线性值)
        x = self.predict(x)   # 输出值
        return x

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

#训练网络
optimizer = torch.optim.SGD(net.parameters(), lr = 0.5)  # optimizer 是训练的工具
loss_func = torch.nn.MSELoss()   # 预测值和真实值的误差计算公式 (均方差)

#可视化训练过程
plt.ion()

for t in range(100):
    prediction = net(x)
    loss = loss_func(prediction, y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    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)
        plt.text(0.5, 0, 'loss = %.4f' % loss.data[0], fontdict={'size':20, 'color': 'red'})
        plt.pause(0.1)

plt.ioff()
plt.show()

创建数据
图片描述
回归结果
图片描述


作者: 鱼忘七秒我忘七年 
链接:https://www.imooc.com/article/24300?block_id=tuijian_wz
来源:慕课网

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### 使用 PyTorch 实现 MLP 进行回归任务 为了使用 PyTorch 构建一个多层感知器(MLP)来执行回归任务,可以遵循以下结构化的方法。此方法不仅涵盖了模型定义,还包括了训练过程中的重要细节。 #### 定义多层感知机模型 构建一个简单的三层全连接神经网络作为回归模型: ```python import torch.nn as nn class RegressionMLP(nn.Module): def __init__(self, input_dim, hidden_dims, output_dim): super(RegressionMLP, self).__init__() layers = [] current_dim = input_dim for hdim in hidden_dims: layers.append(nn.Linear(current_dim, hdim)) layers.append(nn.ReLU()) current_dim = hdim layers.append(nn.Linear(current_dim, output_dim)) # 输出层不加激活函数 self.model = nn.Sequential(*layers) def forward(self, x): return self.model(x) ``` 这段代码创建了一个具有指定输入维度 `input_dim` 和隐藏层尺寸列表 `hidden_dims` 的 MLP 模型[^1]。 #### 设置超参数并准备数据集 在实际应用前,需设定批量大小、迭代次数等超参数,并准备好用于训练的数据集 X_train 及其标签 y_train: ```python batch_size = 64 num_epochs = 100 learning_rate = 0.001 ``` 对于给定的批次数量 batch,可以通过如下方式获取每一批次的数据索引范围[start:end]: ```python for i in range(len(X_train) // batch_size): start = i * batch_size end = start + batch_size ``` 这部分逻辑确保每次只处理一部分数据而不是整个数据集,从而提高效率和内存利用率[^2]。 #### 训练循环 接下来,在主训练循环内完成正向传播、损失计算以及反向传播更新权重的过程: ```python criterion = nn.MSELoss() # 均方误差损失适合于回归问题 optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate) for epoch in range(num_epochs): running_loss = 0 for i in range(len(X_train) // batch_size): inputs = X_train[i*batch_size:(i+1)*batch_size] targets = y_train[i*batch_size:(i+1)*batch_size] outputs = model(inputs.float()) loss = criterion(outputs.squeeze(-1), targets.float()) optimizer.zero_grad() loss.backward() optimizer.step() running_loss += loss.item() print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/(len(X_train)/batch_size)}') ``` 上述代码展示了完整的训练流程,其中包含了对每一 mini-batch 数据的操作,包括前向传递、计算均方差(MSE)损失、清零梯度缓冲区、执行反向传播算法并通过优化器调整参数值。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值