【PyTorch学习】分别使用Numpy和Tensor及Antograd实现机器学习

2023-10-31

本文分别用Numpy、Tensor、autograd来实现同一个机器学习任务,比较它们之间的异同及各自优缺点,从而加深大家对PyTorch的理解。

一、使用Numpy实现机器学习

首先,我们用最原始的Numpy实现有关回归的一个机器学习任务,不用PyTorch中的包或类。

主要步骤包括:

  1. 首先,给出一个数组x,然后基于表达式y=3x2+2,加上一些噪音数据到达另一组数据y。
  2. 然后,构建一个机器学习模型,学习表达式y=wx2+b的两个参数w、b。利用数组x,y的数据为训练数据。
  3. 最后,采用梯度梯度下降法,通过多次迭代,学习到w、b的值。

以下为实战环节的具体步骤:
1)导入需要的库

import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline

2)生成输入数据x及目标数据y

设置随机数种子,即生成同一份数据,以便使用多种方法进行比较。

np.random.seed(666)
x = np.linspace(-1, 1, 100).reshape(100, 1)
y = 3 * np.power(x, 2) + 2 + 0.2 * np.random.rand(x.size).reshape(100, 1)

3)查看x、y数据分布情况

# 绘图
plt.scatter(x,y)
plt.show()

4)初始化权重参数

# 随机初始化参数
w = np.random.rand(1,1)
b = np.random.rand(1,1)

5)训练模型

定义损失函数,假设批量大小为100:

对损失函数求导:

利用梯度下降法学习参数,学习率为lr。

用代码实现上面这些表达式:

lr = 0.001 # 学习率
for i in range(800):
    # 前向传播
    y_pred = np.power(x, 2) * w + b
    # 定义损失函数
    loss = 0.5 * (y_pred - y) ** 2
    loss = loss.sum()
    # 计算梯度
    grad_w = np.sum((y_pred - y) * np.power(x, 2))
    grad_b = np.sum(y_pred - y)
    # 使用梯度下降法,是loss最小
    w -= lr * grad_w
    b -= lr * grad_b

6)可视化结果

plt.plot(x, y_pred, 'r-', label='predict')
plt.scatter(x, y, color='blue', marker='o', label='true')

plt.xlim(-1, 1)
plt.ylim(2, 6)
plt.legend()
plt.show()
print(w, b)

[[2.99850472]] [[2.0989827]]

从结果看来,学习效果还是还是比较理想的。

 

二、使用Tensor及Antograd实现机器学习

上节可以说是纯手工完成一个机器学习任务,数据用Numpy表示,梯度及学习是自己定义并构建学习模型。这种方法适合于比较简单的情况,如果稍微复杂一些,代码量将几何级增加。那是否有更方便的方法呢?

本节我们将使用PyTorch的一个自动求导的包——antograd,利用这个包及对应的Tensor,便可利用自动反向传播来求梯度,无须手工计算梯度。

以下为实战环节的具体步骤:

1)导入需要的库

import torch as t
from matplotlib import pyplot as plt
%matplotlib inline

2)生成训练数据,并可视化数据分布情况

# 随机种子
torch.manual_seed(666)

# 生成x坐标数据,x为tensor,需要把x的形状装换为100×1
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)
# 生成y坐标数据,y为tensor,形状为100×1,另加上一些噪声
y = 3 * x.pow(2) + 2 + 0.2 * torch.rand(x.size())

# 绘图,把tensor数据转换为numpy数据
plt.scatter(x.numpy(), y.numpy())
plt.show()

3)初始化权重参数

# 随机初始化参数,参数w,b为需要学习的,故需requires_grad=True
w = torch.randn(1, 1, dtype = torch.float, requires_grad=True)
b = torch.zeros(1, 1, dtype = torch.float, requires_grad=True)

4)训练模型

lr = 0.001 # 学习率
for i in range(800):
    # 前向传播
    y_pred = x.pow(2).mm(w) + b
    # 定义损失函数
    loss = 0.5 * (y_pred - y) ** 2
    loss = loss.sum()
    # 自动计算梯度,梯度存放在grad属性中
    loss.backward()
    # 手动更新参数,需要用torch.no_grad(),使上下文环境中切断自动求导的计算
    with torch.no_grad():
        w -= lr * w.grad
        b -= lr * b.grad
        
        # 梯度清零
        w.grad.zero_()
        b.grad.zero_()

5)可视化训练结果

plt.plot(x.numpy(), y_pred.detach().numpy(), 'r-', label='predict') # predict
plt.scatter(x.numpy(), y.numpy(), color='blue', marker='o', label='true') # true data

plt.xlim(-1, 1)
plt.ylim(2, 6)
plt.legend()
plt.show()
print(w, b)

tensor([[2.9578]], requires_grad=True) tensor([[2.0990]], requires_grad=True)

这个结果与使用Numpy实现机器学习差不多。

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【PyTorch学习】分别使用Numpy和Tensor及Antograd实现机器学习 的相关文章

随机推荐

  • 基于Rockchip RK3588 Android12 SDK搭建自己的repo 仓库服务器

    基于Rockchip RK3588 Android12 SDK搭建自己的repo 仓库服务器 文章目录 基于Rockchip RK3588 Android12 SDK搭建自己的repo 仓库服务器 搭建自己的repo代码服务器 流程框图 环
  • Markdown自定义CSS样式

    前言 当我第一次接触到Markdown时 我就深深爱上了它 这简洁的界面 编程式的书写都令我爱不释手 最重要的是 还能够支持自定义html css 自定义CSS样式 说到Markdown 就不得不提及Typora这个软件 本例子即是在此软件
  • 解决vue3类型“{}”上不存在属性

    刚创建的一个Vue3和Ts的项目 结果使用Vscode打开后 修改了index vue文件就报错了 修改tsconfig json文件 在tsconfig json文件中添加一行代码 就是让ts识别vue文件 include src ts
  • Ubuntu虚拟机中网络中没有网卡

    由于断电等异常操作 导致vmware的ubuntu系统连接不到网络 ping www baidu com 提示 name or service not known 查看网卡配置 vi etc network interfaces 结果发现只
  • Circular placeholder reference 'server.port' in property definitions

    Exception in thread main java lang IllegalArgumentException Circular placeholder reference server port in property defin
  • Cannot run program "scripts\saveVersion.sh"

    用Maven 编译hadoop遇到以下错误 saveVersion sh script fails in windows cygwin hadoop yarn common 半天是个bug 解决方案如下 Index hadoop mapre
  • C++常用经典算法总结

    一 算法概述 排序算法可以分为两大类 非线性时间比较类排序 通过比较来决定元素间的相对次序 由于其时间复杂度不能突破O nlogn 因此称为非线性时间比较类排序 线性时间非比较类排序 不通过比较来决定元素间的相对次序 它可以突破基于比较排序
  • C#如何通过存储过程从数据库中获得数据

    存储过程就是在数据库中写好的函数 C 通过调用存储过程来获得数据 可以在一定程度上提高数据库的安全性 将一些重要的数据封装了起来 那么如何在C 中调用存储过程呢 一 存储过程 环境如下 1 数据库Itcast2014中包含表TblStude
  • VS的C++项目添加LAPACK库简便方法(注:64位+32位,且不用自己编译库)

    需要材料 1 已经编译好的库文件 dll文件和头文件 http icl cs utk edu lapack for windows lapack libraries 这个网站中有已经用minGW编译好的LAPACK库 lib 一共有三个 除
  • 实践DIV+CSS网页布局入门指南

    实践DIV CSS网页布局入门指南 你正在学习CSS布局吗 是不是还不能完全掌握纯CSS布局 通常有两种情况阻碍你的学习 第一种可能是你还没有理解CSS处理页面的原理 在你考虑你的页面整体表现效果前 你应当先考虑内容的语义和结构 然后再针对
  • uniapp使用jsZip打包多个url文件,下载为一个压缩包

    1 需求及前言 可选中多个文件 类型不限png doc xls ppt等 点击下载时 将选中的文件全部打包成一个压缩包给用户 本文讲解jszip这个插件的打包下载使用方法 2 下载插件 npm install file saver npm
  • kafka服务端常见报错

    打印错误ERROR日志 cat kafkaserver log grep i A3 ERROR 日志目录 1 x data 2 x data logs kedacom project namespace dol kafka dol kafk
  • c++四内存区

    c 程序执行时 内存分为四个区域 1 代码区 存放函数体的二进制代码 由操作系统管理 2 全局区 存放全局变量 静态变量和常亮 3 栈区 编译器自动分配释放 存放函数的参数和局部变量等 4 堆区 程序员分配和释放 若未释放 程序结束时有操作
  • # 关于idea中模块文件夹右下角没有蓝色小方块,pom文件显示橘色

    关于idea中模块文件夹右下角没有蓝色小方块 pom文件显示橘色 模块文件夹中右下角没有蓝色小方块 根本原因是因为模块文件夹中没有xxx iml文件 这个本人亲自试验过 将xxx iml文件删除后 模块文件夹右下角小蓝块立马消失 可以参考下
  • 玩好go的切片

    go的slice 入门就会遇到 但这个东西大多数人都是停留在简单的使用 一些干了好几年的老程序员都说不明白里面的道道 这里面坑不少 恰巧今天有空 好好整理下 永不踩坑 1 为什么要用切片 其他语言大多用的都是数组 在go中 数组的长度是不可
  • 尝试构建知识体系

    1 构建知识体系架构是需要 深入 广知 思考 整理 深入 需要反反复复 学致用 用致学 深度思考 锤炼打磨 不同角度不同方式去尝试思考 实践 广知 需要周围东西的敏感度 好学 求知 充满兴趣 我们积累的知识 能否形成体系 却依赖于我们能否做
  • detectron2的结构介绍及代码实现

    detectron2的结构介绍 上一篇文章 detectron2的简介和配置 d948142375的博客 CSDN博客 介绍了怎么配置detectron2 以下简称DET2 到一台ubuntu18 04的远程服务器 本文将介绍为了实现一个基
  • ResNet之残差结构的理解

    ResNet 论文 2015年提出的ResNet 2016年改进后的ResNet 博客 本人实现的2015 2016的ResNet网络复现 深度学习 残差resnet网络原理详解 ResNet详解 通俗易懂版 主干网络系列 2 ResNet
  • VRPTW

    Python解决VRPTW问题 文章目录 Python解决VRPTW问题 一 VRPTW问题是什么 二 Python代码解决VRPTW问题 2 1 引入库 2 2 参数的设置 2 3 算法部分 2 4 主函数 三 数据集和显示的结果图 3
  • 【PyTorch学习】分别使用Numpy和Tensor及Antograd实现机器学习

    本文分别用Numpy Tensor autograd来实现同一个机器学习任务 比较它们之间的异同及各自优缺点 从而加深大家对PyTorch的理解 一 使用Numpy实现机器学习 首先 我们用最原始的Numpy实现有关回归的一个机器学习任务