前言

这篇文章主要两个内容。

一,把上一篇关于requires_grad的内容补充一下。

二,介绍一下线性回归。

关闭张量计算

关闭张量计算。这个相对简单,阅读下面代码即可。

print("============关闭require_grad==============")
x = torch.randn(3, requires_grad=True)
print(x)
x.requires_grad_(False) # 关闭x的张量计算 print("关闭x的张量计算后的x:", x) # 没有requires_grad属性了 x = torch.randn(3, requires_grad=True)
print("新的带张量计算的x:", x)
y = x.detach() # 去出x的张量附加属性,返回普通张量
print("y没有张量属性:", y)
print("x还有张量属性:", x)
print("============区域内去除x的张量附加属性==============")
with torch.no_grad():
y = x+2
print("y没有张量属性:", y)
print("x还有张量属性:", x)

一个有趣的例子

代码1如下,代码可以正常运行。

x = torch.tensor(1.0)
y = torch.tensor(2.0)
w = torch.tensor(1.0, requires_grad=True)
y_hat = w*x
loss = (y_hat-y)**2
print(loss)
loss.backward()
print(w.grad)

代码2如下,下面代码不能运行。

x = torch.tensor([1.0,2.0])
y = torch.tensor([1.0,2.0])
w = torch.tensor([1.0,2.0],requires_grad=True)
y_hat = w*x
loss =(y_hat-y)**2
print(loss)
loss.backward()
print(w.grad)

这是因为代码1的loss是个值,是个标量,所以它可以执行backward。

而代码2的loss是个向量,他不能执行backward。

线性回归 linear regression

很多视频或文章都说,深度学习要先理解线性回归。然后,大家一翻线性回归的视频,又是一堆。

其实,完全不用看那些课程,不用耽误那些时间。而且,你耽误了那些时间,也未必能理解。

线性回归是要学,但不用刷视频学,其实简单几句话就能讲明白的。只是没人好好讲而已,似乎都等着我们花费非常多的时间自己研究,自己开悟。

线性回归快速理解

首先理解线性是什么;A=2,B=4,肉眼识别B是A的2倍,我们就说A和B有关系,是什么关系呢?就是线性关系;线性就是这个意思,就说俩数有关系。

上篇文章提过,名词是我们学习阻碍,线性这个名词就是具体体现了。

回归就是我们找到B是A的2倍的过程。简单来说,线性回归就是找到一个数,这个数指明了A和B的关系。

找A和B关系,用函数表示,就是y=wx+b;A带入x,B带入y。肉眼推测结果w=2,b=0。

现在把A和B换成俩矩阵,然后w也就是一个矩阵,b还是一个常数。当我们求出w和b时,就是求出了A和B的线性关系。

到此,我们不用去看三四十个线性回归的视频,就已经对线性回归有概念了。

代码

我们直接看代码,x是特征值,y是目标值。

例如我们有一个青蛙A的图片,他的矩阵就是y,然后找一个青蛙B的图片,x就是青蛙B的矩阵。

然后通过线性回归算出,青蛙B与青蛙A的线性关系(w和b)。

这里输入特征x我们写死,不用读取青蛙B的矩阵;y也不用读取青蛙A,也写死。

然后定义w是一个跟x同型矩阵,然后定义b是一个0张量。

然后利用前面的知识使用backward求梯度,然后得到w.grad和b.grad。

然后我们那w.grad和b.grad。

w.grad和b.grad和w,b是同型张量,现在我们用w.grad和b.grad去修正w和b,修正时我们使用learning_rate学习率,确保一次只修改一点点。

然后反复迭代多次,就得到了我们的关系(w和b)。

代码如下:

# 输入特征和目标值
x = torch.tensor([1.0, 2.0])
y = torch.tensor([115.0, 21.0]) # 权重初始化(包括偏差项)
w = torch.tensor([1.0, 2.0], requires_grad=True)
b = torch.tensor(0.0, requires_grad=True) # 学习率
learning_rate = 0.01 # 迭代多次进行优化
for epoch in range(100):
# 预测
y_hat = w * x + b # 损失函数
loss = (y_hat - y).pow(2).mean() # 反向传播
loss.backward() # 更新权重和偏差
with torch.no_grad():
w -= learning_rate * w.grad
b -= learning_rate * b.grad # 清零梯度
w.grad.zero_()
b.grad.zero_() print(f'Epoch {epoch + 1}, Loss: {loss.item()}') # 最终模型参数
print("Final weights:", w)
print("Final bias:", b)

运行如下图:

如图,我循环了100次,但loss的值还是比较大,loss的含义是,越接近0,这个w和b的值就越精确。

当然,如果青蛙A和B实在是不像,那可能循环了1000次,loss还是会很大。

这里我们循环100次后w=[51.8260,-9.4314] b=45.1103

现在我们使用y=wx+b带入x、w、b得到y_pred=51.8260 * 1 +45.1103= 96.9363。我们的y的第一项是115.0。

可以看到x通过wx+b得到的预测值,已经变的很接近y的真实值了。

现在修改运行2000次,运行如下图:

y=wx+b带入x、w、b得到y_pred=62.4444 * 1 +52.5554= 114.9998。

而我们的y的第一项是115.0。

可以看到,预测值已经非常接近真实值了。

传送门:

零基础学习人工智能—Python—Pytorch学习(一)

零基础学习人工智能—Python—Pytorch学习(二)

学习就先到这。


注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!



若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

https://www.cnblogs.com/kiba/p/18350389

零基础学习人工智能—Python—Pytorch学习(三)的更多相关文章

  1. 如何零基础开始自学Python编程

    转载——原作者:赛门喵 链接:https://www.zhihu.com/question/29138020/answer/141170242 0. 明确目标 我是真正零基础开始学Python的,从一 ...

  2. 零基础快速掌握Python系统管理视频课程【猎豹网校】

    点击了解更多Python课程>>> 零基础快速掌握Python系统管理视频课程[猎豹网校] 课程目录 01.第01章 Python简介.mp4 02.第02章 IPython基础.m ...

  3. 零基础的人该怎么学习JAVA

    对于JAVA有所兴趣但又是零基础的人,该如何学习JAVA呢?对于想要学习开发技术的学子来说找到一个合适自己的培训机构是非常难的事情,在选择的过程中总是  因为这样或那样的问题让你犹豫不决,阻碍你前进的 ...

  4. 零基础学完Python的7大就业方向,哪个赚钱多?

    “ 我想学 Python,但是学完 Python 后都能干啥 ?” “ 现在学 Python,哪个方向最简单?哪个方向最吃香 ?” “ …… ” 相信不少 Python 的初学者,都会遇到上面的这些问 ...

  5. 零基础如何入门Python

    编程零基础如何学习Python 如果你是零基础,注意是零基础,想入门编程的话,我推荐你学Python.虽然国内基本上是以C语言作为入门教学,但在麻省理工等国外大学都是以Python作为编程入门教学的. ...

  6. 零基础如何学Python爬虫技术?

    在作者学习的众多编程技能中,爬虫技能无疑是最让作者着迷的.与自己闭关造轮子不同,爬虫的感觉是与别人博弈,一个在不停的构建 反爬虫 规则,一个在不停的破译规则. 如何入门爬虫?零基础如何学爬虫技术?那前 ...

  7. 零基础自学人工智能,看这些资料就够了(300G资料免费送)

    为什么有今天这篇? 首先,标题不要太相信,哈哈哈. 本公众号之前已经就人工智能学习的路径.学习方法.经典学习视频等做过完整说明.但是鉴于每个人的基础不同,可能需要额外的学习资料进行辅助.特此,向大家免 ...

  8. 零基础自学用Python 3开发网络爬虫

    原文出处: Jecvay Notes (@Jecvay) 由于本学期好多神都选了Cisco网络课, 而我这等弱渣没选, 去蹭了一节发现讲的内容虽然我不懂但是还是无爱. 我想既然都本科就出来工作还是按照 ...

  9. 零基础怎么学Python编程,新手常犯哪些错误?

    Python是人工智能时代最佳的编程语言,入门简单.功能强大,深获初学者的喜爱. 很多零基础学习Python开发的人都会忽视一些小细节,进而导致整个程序出现错误.下面就给大家介绍一下Python开发者 ...

  10. 零基础如何使用python处理字符串?

    摘要:Python的普遍使用场景是自动化测试.爬取网页数据.科学分析之类,这其中都涉及到了对数据的处理,而数据的表现形式很多,今天我们来讲讲字符串的操作.   字符串是作为任意一门编程语言的基础,在P ...

随机推荐

  1. FolkMQ 1.6.0(纯血国产,适合信创)

    FolkMQ 是个"新式"的消息中间件.强调:"简而强".可内嵌,可单机,可集群(部署包为 9Mb). 功能简表 角色 功能 生产者(客户端) 发布普通消息.Q ...

  2. 记录一次BoxedApp Packer脱壳解包的记录

    收到朋友的一个求助,一个硬件配套的上位机软件,无法联系到供应商,没有授权,在新电脑安装后无法使用. 简单的记录下过程 首先打开发过来的软件的目录下,一个配置工具,从图片可以判断,是.net winfo ...

  3. 2024-06-19:用go语言,给定一个起始下标为 0 的整数数组 nums 和一个整数 k, 可以执行一个操作将相邻两个元素按位AND后替换为结果。 要求在最多执行 k 次操作的情况下, 计算数组

    2024-06-19:用go语言,给定一个起始下标为 0 的整数数组 nums 和一个整数 k, 可以执行一个操作将相邻两个元素按位AND后替换为结果. 要求在最多执行 k 次操作的情况下, 计算数组 ...

  4. Django Paginatior分页,页码过多,动态返回页码,页码正常显示

    问题: 当返回数据较多,如设置每页展示10条,数据接近200条,返回页码范围1~20,前端每个页码都显示的话,就会出现页码超出当前页面,被遮挡的页码无法操作和显示不美观: 代码优化: 在使用pagin ...

  5. Django项目实现分页返回,结合forloop实现编号递增

    需要导入Paginator包 from django.core.paginator import Paginator 实现步骤: 需要设置每页大小 需要获取每页的页码, 查询对应的数据,提供给Pagi ...

  6. bugly进阶01-集成bugly时的相关参数

    bugly进阶01-集成bugly时的相关参数 个人github CSDN博客 前言 bugly的集成十分的简单,在代码中只需要简单的一个语句就可以轻松集成: - (BOOL)application: ...

  7. Android自动化无障碍服务开源库-Assists v3.0.0

    Assists v3.0.0 Android无障碍服务(AccessibilityService)开发框架,快速开发复杂自动化任务.远程协助.监听等 Android无障碍服务能做什么 利用Androi ...

  8. opengrok源代码在线阅读平台搭建及字体修改

    服务搭建 我所编写的docker-compose.yml如下,成功运行后将源码目录移动至 /data/opengrok/src ,重启容器使得opengrok快速更新索引 services: open ...

  9. USB OTG有关协议

    想了解USB OTG的工作原理,需要知道三个协议: ADP:Attach Detection Protocol HNP:Host Negotiation Protocol SRP:Session Re ...

  10. Xilinux PS与PL交互:裸机程序读写FPGA-REG

    背景 当时在搞ZYNQ驱动的时候,出于TDD的思想,从最简单的功能开始验证.因此就涉及到了下面的需求. PL侧会提供寄存器地址供PS端读写,这部分的寄存器在PL侧作为Avalon的IP,对PS端来说, ...