4.5pytorch批量梯度下降(代码片段)

王小小小草 王小小小草     2022-12-06     273

关键词:

欢迎订阅本专栏:《PyTorch深度学习实践》
订阅地址:https://blog.csdn.net/sinat_33761963/category_9720080.html

  • 第二章:认识Tensor的类型、创建、存储、api等,打好Tensor的基础,是进行PyTorch深度学习实践的重中之重的基础。
  • 第三章:学习PyTorch如何读入各种外部数据
  • 第四章:利用PyTorch从头到尾创建、训练、评估一个模型,理解与熟悉PyTorch实现模型的每个步骤,用到的模块与方法。
  • 第五章:学习如何利用PyTorch提供的3种方法去创建各种模型结构。
  • 第六章:利用PyTorch实现简单与经典的模型全过程:简单二分类、手写字体识别、词向量的实现、自编码器实现。
  • 第七章利用PyTorch实现复杂模型:翻译机(nlp领域)、生成对抗网络(GAN)、强化学习(RL)、风格迁移(cv领域)。
  • 第八章:PyTorch的其他高级用法:模型在不同框架之间的迁移、可视化、多个GPU并行计算。

在实际应用中,数据集往往是非常大的,如果每次迭代都对所有样本进行前向-后向计算从而更新依次参数,就会非常慢,因此常用的方式是将总样本分割为多批样本,每计算一批样本就更新一次参数。PyTorch提供了每次产生一批数据的迭代器,提升了效率。

来看看具体做法,先创建一批数据x,y

import torch

# 创建了50个样本
x = torch.unsqueeze(torch.linspace(1,10,50), dim=1)
y = x.pow(2)

将数据转换为TensorDataset

dataset = Data.TensorDataset(x, y)

将TensorDataset转换成dataloader,设置参数batch_size,dataloader是一个迭代器,它会每次都吐出batch_size个样本

dataloader = Data.DataLoader(dataset=dataset, batch_size=10)
print(dataloader)

for inp, out in dataloader:
    print(inp.shape)
    print(out.shape)
    print()
<torch.utils.data.dataloader.DataLoader object at 0x000001C262A235C0>
torch.Size([10, 1])
torch.Size([10, 1])

torch.Size([10, 1])
torch.Size([10, 1])

torch.Size([10, 1])
torch.Size([10, 1])

torch.Size([10, 1])
torch.Size([10, 1])

torch.Size([10, 1])
torch.Size([10, 1])

使用dataloader,以训练一个简单的线性模型为例,完整的代码如下:

import torch
import torch.nn as nn
import torch.utils.data as Data


class RegressionModel(nn.Module):
    def __init__(self, n_input, n_hidden, n_output):
        super(RegressionModel, self).__init__()
        self.linear1 = nn.Linear(n_input, n_hidden)
        self.relu = nn.ReLU()
        self.linear2 = nn.Linear(n_hidden, n_output)

    def forward(self, input):
        hidden = self.linear1(input)
        activate = self.relu(hidden)
        output = self.linear2(activate)

        return output

# # 数据
# 原始数据,x与y
x = torch.unsqueeze(torch.linspace(1,10,50), dim=1)
y = x.pow(2)

# 转换成TensorDataset
dataset = Data.TensorDataset(x, y)

# 转换成dataloader
dataloader = Data.DataLoader(dataset=dataset, batch_size=10)


# # 模型
# 模型结构
model = RegressionModel(1, 10, 1)

# 优化器
optim = torch.optim.SGD(model.parameters(), lr=0.0001)
# scheduler = torch.optim.lr_scheduler.StepLR(optim, 1000/)

# 损失
loss_f = nn.MSELoss(reduce=True)

# # 训练
for e in range(5000):
    epoch_loss = 0
    for i, (inp, out) in enumerate(dataloader):
        optim.zero_grad()

        predict = model(inp)
        loss = loss_f(predict, out)

        loss.backward()

        optim.step()
        epoch_loss += loss.data

    # scheduler.step()

    if e % 500 == 0:
        print('the loss of %d batch is : %f' % (e, epoch_loss / (50/10)))


# # 保存与加载模型
# 方式1
model_path = 'data/regression_model.pkl'
torch.save(model, model_path)
reload_model = torch.load(model_path)
print(reload_model(torch.Tensor([2])))

# # 保存与加载模型
# 方式2
model_path2 = 'data/regression_model2.pkl'
torch.save(model.state_dict(), model_path2)
reload_model = RegressionModel(1,10,1)
reload_model.load_state_dict(torch.load(model_path2))
print(reload_model(torch.Tensor([2])))
C:\\Users\\CC\\Anaconda3\\lib\\site-packages\\torch\\nn\\functional.py:52: UserWarning: size_average and reduce args will be deprecated, please use reduction='elementwise_mean' instead.
  warnings.warn(warning.format(ret))


the loss of 0 batch is : 2166.915283
the loss of 500 batch is : 32.224888
the loss of 1000 batch is : 8.669624
the loss of 1500 batch is : 4.125319
the loss of 2000 batch is : 2.358487
the loss of 2500 batch is : 1.470182
the loss of 3000 batch is : 1.147537
the loss of 3500 batch is : 0.912313
the loss of 4000 batch is : 0.862902
the loss of 4500 batch is : 0.790936
tensor([4.3891], grad_fn=<ThAddBackward>)
tensor([4.3891], grad_fn=<ThAddBackward>)


C:\\Users\\CC\\Anaconda3\\lib\\site-packages\\torch\\serialization.py:241: UserWarning: Couldn't retrieve source code for container of type RegressionModel. It won't be checked for correctness upon loading.
  "type " + obj.__name__ + ". It won't be checked "

pytorch常用优化器总结(包括warmup介绍及代码实现)(代码片段)

...小批量梯度下降法(MBGD)动量优化SGD+MomentumNAGpytorch中SGD:自适应学习率AdaGradAdadeltaRMSPropAdamwarmup优化算法大致分为:梯度下降法,动量优化法,自适应学习率三种。梯度下降法梯度下降GD通过lo 查看详情

pytorch深度学习-03梯度下降(快速入门)(代码片段)

目录1.GradientDescent(梯度下降)1.1OptimizationProblem(优化问题)1.2GradientDescentalgorithm(梯度下降算法)1.2.1Gradient(梯度)1.2.2Update(更新权重)1.3代码实现1.4结果截图2.StochasticGradientDescent(随机梯度下降)2.1代码实现2.2结果截图3.Batch(批量的随机梯... 查看详情

pytorch中常见的优化算法介绍(代码片段)

目录常见的优化算法介绍梯度下降算法(batchgradientdescent,BGD)随机梯度下降法(Stochasticgradientdescent,SGD)小批量梯度下降(Mini-batchgradientdescent,MBGD)动量法AdaGradRMSPropAdam常见的 查看详情

pytorch优化器全总结sgdasgdrpropadagrad(代码片段)

目录写在前面一、 torch.optim.SGD随机梯度下降SGD代码SGD算法解析1.MBGD(Mini-batchGradientDescent)小批量梯度下降法 2.Momentum动量3.NAG(Nesterovaccelerated gradient)SGD总结二、torch.optim.ASGD随机平均梯度下降三、torch.optim.Rprop四、tor 查看详情

pytorch学习2b站刘二大人《pytorch深度学习实践》——梯度下降算法(gradientdescent)(代码片段)

b站课程链接:梯度下降算法一、梯度下降算法1.简介梯度下降算法是一种求解函数最优值的迭代算法,给定一个初值,通过负梯度方向进行更新查找。2.程序实现及结果importmatplotlib.pyplotasplt#训练集x_data=[1.0,2.0,3.0]y_... 查看详情

pytorch之梯度下降和方向传播理论介绍

目录梯度梯度下降梯度下降的一般求法:批量梯度下降法BGD随机梯度下降法SGD小批量梯度下降法MBGD反向传播算法计算图和反向传播神经网络中的反向传播梯度梯度:是一个向量,学习(参数更新)的方向,导数+... 查看详情

pytoch随笔(光速入门篇)(代码片段)

文章目录Pytorch梯度线性回归原始版高级API版优化器梯度下降算法(batchgradientdescentBGD)随机梯度下降法(StochasticgradientdescentSGD)小批量梯度下降(Mini-batchgradientdescentMBGD)动量法(Momentum)AdaGradRMSPropAdam手写数字案例数据集数据划分网络构... 查看详情

pytorch常用优化器总结(包括warmup介绍及代码实现)(代码片段)

...小批量梯度下降法(MBGD)动量优化SGD+MomentumNAGpytorch中SGD:自适应学习率AdaGradAdadeltaRMSPropAdamwarmup优化算法大致分为:梯度下降法,动量优化法,自适应学习率三种。梯度下降法梯度下降GD通过loss对ω\\omegaω的... 查看详情

线性回归之批量梯度下降代码实例(代码片段)

目录一.梯度下降批量梯度下降二.学习率散点图 直线拟合在学习了《机器学习》后,相信大家第一个接触的就是线性回归。可能有很多小伙伴跟我一样,一上来就一脸懵,关于线性回归为什么会使用哪些很复杂的公... 查看详情

在 pytorch 中创建自定义梯度下降

】在pytorch中创建自定义梯度下降【英文标题】:Createcustomgradientdescentinpytorch【发布时间】:2021-10-0722:23:00【问题描述】:我正在尝试使用PyTorchautograd来实现我自己的批量梯度下降算法。我想创建一个简单的单层神经网络,具有... 查看详情

pytorch学习2b站刘二大人《pytorch深度学习实践》——梯度下降算法(gradientdescent)(代码片段)

b站课程链接:梯度下降算法一、梯度下降算法1.简介梯度下降算法是一种求解函数最优值的迭代算法,给定一个初值,通过负梯度方向进行更新查找。2.程序实现及结果importmatplotlib.pyplotasplt#训练集x_data=[1.0,2.0,3.0]y_... 查看详情

看代码理解批量梯度下降求解线下回归问题

layout:posttitle:梯度下降算法subtitle:批量梯度下降求解线下回归问题date:2017-12-01author:Felixcatalog:truetags:-机器学习-优化算法---//##############################################################//#//#批量梯度下降算法实例:求解线性回归问题//#//### 查看详情

机器学习:随机梯度下降法(线性回归中的应用)(代码片段)

...度中的每一项计算:,要计算所有样本(共m个); #批量梯度下降法的思路:计算损失函数的梯度,找到优化损失函数的最近距离,或者称最直接的方向;  #批量梯度下降法的梯度计算:每一次都对数据集中的所有样本的... 查看详情

深度学习中的一些组件及使用技巧(代码片段)

...影响参数更新。梯度下降主要包含三种梯度下降:(1)批量梯度下降(BatchGradientDescent)使用所有的训练样本来更新每次迭代中的模型参数(2)随机梯度下降(StochasticGradientDescent)在每次迭代中,仅使用单个训练样本更新参数... 查看详情

pytorch动态调整学习率,学习率自动下降,根据loss下降(代码片段)

0为什么引入学习率衰减?我们都知道几乎所有的神经网络采取的是梯度下降法来对模型进行最优化,其中标准的权重更新公式:W+=α∗ gradient W+=\\alpha*\\textgradientW+=α∗ gradient 学习率α\\alphaα控制... 查看详情

pytorch-线性回归_sgd_动量梯度下降(代码片段)

本篇是一个练手项目,目的在于:1.熟悉pytorch2.实现SGD与动量梯度下降,并对比收敛性 手动实现线性回归模型,一个很简单的模型,不多介绍,直接上代码importtorchastimportmatplotlib.pylabasplt###制造数据defmake_data():#y=2x+3x=t.rand(1,10... 查看详情

正规方程,梯度下降,岭回归——机器学习(代码片段)

...算法(FG)2.2随机梯度下降算法(SG)2.3小批量梯度下降算法(mini-batch)2.4随机平均梯度下降算法(SAG)三.波士顿房价预测——正规方程( 查看详情

pytorch实现线性回归(api完成)(代码片段)

PytorchAPI完成线性回归Pytorch完成基础的模型目标1.Pytorch完成模型常用API1.1nn.Module1.2优化器类1.3损失函数1.4线性回归完整代码2.在GPU上运行代码3.常见的优化算法介绍3.1梯度下降算法(batchgradientdescentBGD)3.2随机梯度下降法(St... 查看详情