前言

其实学习人工智能不难,就跟学习软件开发一样,只是会的人相对少,而一些会的人写文章,做视频又不好好讲。

比如,上来就跟你说要学习张量,或者告诉你张量是向量的多维度等等模式的讲解;目的都是让别人知道他会这个技术,但又不想让你学。

对于学习,多年的学习经验,和无数次的回顾学习过程,都证明了一件事,如果一篇文章,一个视频,一个课程,我没学明白,那问题一定不在我,而是上课的主动或被动的不想让我学会,所以,出问题的一定是学习资料。

比如英语,当真会了以后,再回去看自己之前学过的课,就知道了,那是英语老师没好好教,哪有真正想让你学会英语的人,会告诉你【come=来,out=出去】呀。

比如线性代数,等会了以后,再回去看之前看不懂的课程视频,就知道了,是上课老师估计模糊的关键信息。

学习软件开发,相信大家也都有类似的经验,当你想学一个知识点时,各种搜索,就是看不懂,最后学会的原因只有两种,1,你找到了真正的教你知识的文章,2,你通过搜索的信息,自己悟了出来。这其实就是在证明,绝大多数的文章和视频都不想真正教你,包括正规学校的老师和教材。

入门学习

首先,介绍一下我学习的资料,我通过一通搜索,终于找到了最好的学习资料,该视频是认真教你学习的,唯一的缺点可能就是,上课的人说的是英语,有点印度口音。不过,个人感觉他带点口语,反而更好听懂。

重点关注一下下面单词视频里会多次提到,注意了后就不会被英语卡住了。

numpy:这个单词,这不是个单词,但是是python的库。

vector:向量,下面有解释。

tensor:张量,下面有解释。

gradient:梯度,指的就是我下面的提到的求偏导数。

地址是:https://www.youtube.com/watch?v=exaWOE8jvy8&list=PLqnslRFeH2UrcDBWF5mfPGpqQDSta6VK4&index=3

安装

pytorch和tensorflow都是做人工智能的,prtorch的函数相对更友好,所以入门更高效。

pytorch官网地址:https://pytorch.org/get-started/locally/

使用pytorch前,先安装环境,我这里使用了vscode,安装完vscode后,在扩展里把python的包瞎按一些就行。

一般来讲学习都使用cpu版本。安装命令如下:

pip3 install torch torchvision torchaudio

如果使用gpu,安装命令如下:

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

安装完成后,执行代码,如果执行成功,则安装成功。

import torch
x =torch.ones(1)
print(x)

名词介绍

矩阵:就是我们的表。

向量(vector):这种只有一行/一列的矩阵,叫向量。

1,1,0

二维张量(tensor2D):这有多行多列的矩阵叫二维张量。

1,1,0
1,0,1

三维张量(tensor3D),就是三维数组。

多维张量同多维数组。

为什么叫向量或者张量?我们把[1,1,0]换个想象就行,[1,1,0]是自原点向x=1,y=1,z=0发射出去的线,那[1,1,0]就不在是个数据了,就变成张量了。但本质还是数据。这地方不要细究,理解就可以了,毕竟我们不是研究数学的。

代码入门

使用pytorch进行张量的基础。

import torch
import numpy as np
x=torch.empty(1) # 创建一个只有一个元素的向量(vector),元素值是未定义的,未定义的就是0,打印出来是【0.】,这是因为默认的元素类型是float32
print(x)
x=torch.empty(3) # 创建一个有三个元素的向量(vector),元素值是未定义的
print(x)
x=torch.empty(3,2) # 创建一个矩阵,,元素值是未定义的
print(x) x=torch.rand(3,2) # 创建一个3*2的矩阵,并随机赋值
print(x)
x=torch.zeros(3,2) # 创建一个3*2的矩阵,并赋值0
print(x) x=torch.ones(2,2) # 创建一个2*2的矩阵,并赋值1,打印出来是【1.】
print(x)
print("打印类型")
print(x.dtype) #dtype是data type,会打印出元素的类型,打印内容是torch.float32
x=torch.ones(3,3,dtype=torch.int) # 创建一个3*3的矩阵,并赋值1,打印出来是【1】,这会就不带.了
print(x)
x=torch.ones(3,3,dtype=torch.double) # 创建一个3*3的矩阵,并赋值1,打印出来是【1.】,double类型又带.了
print(x)
print(x.size()) #size是个函数,这样打印会打印出toString()的感觉,值是【torch.Size([3, 3])】
print(x.size().numel()) # 元素个数,值是9
x=torch.tensor([2.2,3.1]) # 自定义张量
print(x)
print("===========加法============")
x=torch.ones(3,3,dtype=torch.int) # 创建一个3*3的矩阵,并赋值1,打印出来是【1】,这会就不带.了
print(x)
y =torch.ones(3,3,dtype=torch.int)
print(y)
z=x+y #矩阵相加
print(z)
z=torch.add(x,y) #矩阵相加
print(z)
print("===========计算print(y.add_(x))============")
print(y.add_(x)) #把x加到y中去
print("===========减法============")
z=x-y #矩阵相减
print(z)
z=torch.sub(x,y) #矩阵相减
print(z)
print("===========计算print(y.sub_(x))============")
print(y.sub_(x)) #把x减去从y中
print("===========乘法============") #这个乘法是元素相对的相乘,而不是线性代数的 A23*A32
z=x*y #矩阵相乘
print(z)
z=torch.mul(x,y)
print(z)
print(y.mul_(x))
print("===========除法============")
z=x/y #矩阵相乘除
print(z)
z=torch.div(x,y)
print(z)
print("===========列表============")
x=torch.rand(5,4) # 创建一个3*2的矩阵,并随机赋值
print(x[:,0]) #打印全部行,但只取第一列
print(x[0,:]) #打印全部列,但只取第一行
print(x[0,0]) #打印i=0 j=0的元素
print(x[1,1].item()) #如果只取一个元素值,则可以取他的真实值
print(x)
print("===========view可以resize tensor============")
x=torch.rand(5,4)
y=x.view(20) #返回一个新的张量,这个是返回一个1行的20个元素的张量
print(y)
y=x.view(-1,10)
print(y) # 这个是返回2行,每行10个,他做了自动适配
print(y.size())#输出size
#print(x.view(-1,7)) # 这个自动适配不了,因为不能被7整除
print("===========numpy numpy只能在cpu上使用,不能在gpu上使用============")
a=torch.ones(5) #行向量,值是1,元素是5
b=a.numpy() #返回 numpy.ndarray类型的numpy下的张量,相当于转了类型,用于计算,该函数有参数 默认是false,表示使用cpu
print(b,type(b))
#这里虽然a转了类型到b,但b和a是对象封装,引用地址一样 所以当我们给a+1时,b也会+1
a.add_(1)
print(a)
print(b)#虽然a b类型不一样,但值都改变了
print("===========从numpy.ndarray转成tensor张量的方式============")
a = np.ones(5) #行向量 5元素 值是1
b =torch.from_numpy(a) #numpy的ndarray转tensor 同样是装箱拆箱 修改a的值 b也会变
a+=1
print(b)
print(a)
print("===========gpu============")
if(torch.cuda.is_available()):
#CUDA 是指 NVIDIA 的并行计算平台和编程模型,它利用图形处理单元 (GPU) 的处理能力来加速计算密集型任务
device =torch.device("cuda") #获取cuda驱动
x=torch.ones(5,device=device)#创建时指定了使用cpu的内存
y=torch.ones(5)#创建时使用cpu的内存
y=y.to(device)#将y转到gpu
z=x+y #这个操作是在gpu的内存上进行了
#z.numpy()#这个不能执行,因为z在gpu的内存上
z =z.to("cpu") #转回到cpu
else:
print("this is cpu")

requires_grad例子。

这里要点高数基础。

首先是导数,这个大家忘了的可以百度一下。

偏导数:这个就是f(x,y)=x+y这样的函数求导,只是对x求导时,把y当常量c,反之亦然。

print("===========requires_grad 例子1============")
#使用自动微分(autograd)
x=torch.ones(5,requires_grad=True) #默认requires_grad是false 1,计算梯度:requires_grad 是一个布尔参数,用于指定一个张量是否需要计算梯度 2,自动求导:使用 requires_grad=True 的张量进行的所有操作都会被记录,以便稍后使用 backward() 方法进行自动求导。
print(x)
# 对张量进行一些操作
y = x + 2
print(y)
# 再进行一些操作
z = y * y * 3
print("======分割线1=====")
print(z)
out = z.mean() #是一个张量操作,它计算张量 z 的所有元素的平均值。 看做f(x)=(x1+x2+x3+x4)/4 然后对每个x求偏导,在把值带回去
print("======分割线2=====")
print(out)
# 进行反向传播,计算梯度
out.backward()
print("======分割线3=====")
print(x.grad) # 输出x的梯度
print("===========requires_grad 例子2============")
# 创建一个张量,并指定需要计算梯度
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
# 定义一个标量函数 平方在求和 相当于函数 f()= x1²+ x2²,+ x3²
y = x.pow(2).sum()
# 进行反向传播,计算梯度 x`的梯度,它对应于函数 f(x1,x2,x3)= x1²+ x2²+ x3², 三个偏导数就是 2x1,2x2,2x3,带入tensor的值 即'[2x1,2x2,2x3]
y.backward()
# 输出 x 的梯度
print(x.grad) # 输出 tensor([2., 4., 6.])
print("===========requires_grad 例子3============")
# 创建一个张量,并指定需要计算梯度
x = torch.tensor([[1.0, 2.0],[4.0, 5.0]], requires_grad=True)
# 定义一个标量函数 平方在求和 相当于函数 f()= x1²+ x2²+ x3²+ x4²
y = x.pow(2).sum()
# 进行反向传播,计算梯度 x`的梯度,这里是2*2矩阵,但计算的时候,就按元素个数算x,没有行列ij。
# 它对应于函数 f(x1,x2,x3,x4)= x1²+ x2²,+ x3²+ x4², 四个偏导数就是 2x1,2x2,2x3,2x4,带入tensor的值 即'[2x1,2x2,2x4,2x5]
y.backward()
# 输出 x 的梯度
print(x.grad) # 输出 tensor([[2, 4][8,10]])

基础学习就先到这。


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



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

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

零基础学习人工智能—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开发的人都会忽视一些小细节,进而导致整个程序出现错误.下面就给大家介绍一下Python开发者 ...

  6. 零基础如何入门Python

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

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

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

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

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

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

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

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

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

随机推荐

  1. es语法 rest api 模拟根据歌手,歌名,歌词来搜索demo

    #创建索引songs_v1 PUT { - "acknowledged": true, "shards_acknowledged": true, "i ...

  2. Maven配置阿里云镜像和本地仓库路径

    配置阿里云镜像仓库 在settings > mirrors标签下添加以下内容 <!-- Aliyun Mirror --> <mirror> <id>alim ...

  3. 5分钟了解LangChain的路由链

    上上篇文章<5分钟理透LangChain的Chain>里用到了顺序链SequentialChain,它可以将多个链按顺序串起来.本文介绍LangChain里的另外1个重要的链:路由链. 1 ...

  4. java并发和排序的简单例子(Runnable+TreeSet)

    很多时候并发需要考虑线程安全,但也有很多时候和线程安全毛关系都没有,因为并发最大的作用是并行,线程安全仅仅是并发的一个子话题. 例如常常会用于并发运算,并发i/o. 下文是一个练习笔记. 运行环境:w ...

  5. Golang线程池gpool

    背景 golang中使用并发要考虑很多问题,如控制并发量.等待Goroutine执行完毕等. 看下面一段代码: var wg sync.WaitGroup count := 10 wg.Add(cou ...

  6. Linux中的环境变量PS1,打造你的专属终端

    文章目录 介绍 PS1的格式 设置字体样式 举例 小建议 进阶 介绍 好看的终端是怎么做的呢?通过PS1这个环境变量! PS1的格式 PS1='[\u@\h \w]\$ ' 样式: 解释: [是普通字 ...

  7. 嵌入式进阶之关于SPI通信的案例分享——基于全志科技T3与Xilinx Spartan-6处理器

    本文主要介绍基于全志科技T3与Xilinx Spartan-6的通信案例. 适用开发环境: Windows开发环境:Windows 7 64bit.Windows 10 64bit Linux开发环境 ...

  8. 一次Java服务内存过高的分析过程

    现象 年前,收到了短信报警,显示A服务的某台机器内存过高,超过80% 如上图所示,内存会阶段性增加.奇怪的是,十多台机器中只有这一台有这个问题 堆内内存分析 最先怀疑是内存泄漏的问题,所以首先使用jm ...

  9. MQTT协议介绍与Broker列表

    MQTT协议介绍 MQTT是什么? MQTT 是基于 Publish/Subscribe(发布/订阅) 模式的物联网通信协议,凭借简单易实现.支持 QoS.报文小等特点. 官网:https://mqt ...

  10. SQLserver中的存储过程

    变量分为: ->局部变量: •局部变量必须以标记@作为前缀 ,如@Age int •局部变量:先声明,再赋值 1 -- 语法:声明一个变量,然后赋值,打印出来 2 -- 第一步 3 declar ...