目录
1.1什么是pytorch
1.2pytorch基础语法
【自然语言处理|【黑马程序员自然语言处理实战课程】学习笔记---pytorch基础知识和autograd】 1.3pytorch基本运算
1.4关于torch tensor和numpy array之间的相互转换
2.1autograd基础概念
2.2 关于tensor操作
1.1什么是pytorch pytorch是一个基于Numpy的科学计算包,向他的使用者提供两大功能
- 作为numpy的替代者,向用户提供GPU强大功能的能力;
- 作为一款深度学习的平台,向用户提供最大的灵活性和速度
- tensor张量:类似于numpy中的ndarray数据结构,最大区别在于tensor可以利用GPU的加速功能。
- 需要先将torch引用进来
from __future__ import print_function import torch
- 创建一个没有初始化的矩阵
x = torch.empty(5,3)
print(x)
- 创建一个有初始化的矩阵
y=torch.rand(5,3) print(y)
注意:对比有无初始化矩阵:当声明一个未初始化的矩阵时,它本身不包含任何确切的值,当创建一个未初始化的矩阵时,分配给矩阵的内存中有什么数值就赋值给这个矩阵,本质上是毫无意义的数据
- 创建一个全零 矩阵并可指定数据元素的类型为long
z=torch.zeros(5,3,dtype=torch.long) print(z)
- 直接通过数据创建张量
a=torch.tensor([2.5,3.5])
print(a)
- 通过已有的一个张量创建相同尺寸的张量
文章图片
- 加法操作
# 第一种加法
x=torch.rand(5,3)
y=torch.rand(5,3)
print(x+y)
print('*********************')
# 第二种加法
print(torch.add(x,y))
print('*********************')
# 第三种加法
# 提前设定一个空张量
result=torch.empty(5,3)
# 将空的张量作为加法的结果存储张量
torch.add(x,y,out=result)
print(result)
print('*********************')
# 第四种加法
y.add_(x)
print(y)
注意:所有in-place的操作函数都有一个下划线的后缀;比如:x.copy_(y)x,x.add_(y),都会直接改变x的值。
- 用类似numpy方式进行张量积算
x=torch.empty(5,3)
print(x[:,:3])
- 改变张量的形状:torch.view()
x=torch.randn(4,4)
# tensor.view()操作需要保证数据元素的总数量不变
y=x.view(16)
# -1代表自动匹配个数
z=x.view(-1,8)
print(x.size(),y.size(),z.size())
- 如果张量中只有一个元素,可以用.item()值取出,作为一个python number
x=torch.randn(1)
print(x)
print(x.item())
1.4关于torch tensor和numpy array之间的相互转换
- torch tensor和numpy array共享底层的内存空间,因此改变其中一个值,另一个也随之被改变。
a=torch.ones(5)
print(a)
#将torch tensor转换成numpy array
b=a.numpy()
print(b)
# 对其中一个做加法操作,另一个随之改变
a.add_(1)
print(a)
print(b)
- 将numpy转化为torch
import numpy as np
a=np.ones(5)
b=torch.from_numpy(a)
np.add(a,1,out=a)
print(a)
print(b)
注意:所有的CPU上的tensors,除了CharTensor,都可以转换成numpy array 并可以反向转换
关于Cuda tensor:Tensor可以用.to()方法来将其移动到任意设备上
import torch
x=torch.randn(4,4)
# 如果服务器已经安装了cuda
if torch.cuda.is_available():
# 定义一个设备对象,这里指定成CUDA,即使用GPU
device=torch.device("cuda")
# 直接在GPU上创建一个Tensor
y=torch.ones_like(x,device=device)
# 将在CPU上的x张量移动到GPU上?
x=torch.to(device)
# x和y都在GPU上,才能支持加法运算
z=x+y
print(z)
# 也可以将z转移到CPU上面,并同时指定张量元素的数据类型
print(z.to("cpu",torch.double))
小节总结:
基本元素操作:
矩阵初始化:
- torch.empty()
- torch.rand(n,m)
- torch.zeros(n,m,dtype=torch.long)
- x.new_ones(n,m,dtype=torch.double)
- torch.randn_like(x,dtype=torch.float)
- x.size()
- x+y
- torch.add(x,y)
- torch.add(x,y,out=result)
- y.add_(x)
- x.view()
- x.item()
- b=a.numpy()
- b=torch.from_numpy(a)
- x=x.to(device)
提供一个对tensor上所有操作自动微分的功能
文章图片
2.2 关于tensor操作
import torch
x=torch.ones(3,3)
print(x)
y=torch.ones(2,2,requires_grad=True)
print(y)# 在具有requires_grad=True的tensor上执行一个加法操作。
z=y+2
print(z)
# 打印tensor的grad_fn属性
print(x.grad_fn)
print(y.grad_fn)
在tensor执行更复杂的操作:
z=y*y*3
out=z.mean()
print(z,out)
关于require_grad_():该方法可以原地改变tensor的属性,requires_grad的值,如果没有主动设定默认为False.
a=torch.randn(2,2)
a=((a*3)/(a-1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b=(a*a).sum()
print(b.grad_fn)
2.3 关于梯度Gradients
在python中,反向传播是依靠.backward()实现的
out.backward()
print(x.grad)
关于自动求导的属性设置:可以通过设置.requires_grad=True来执行自动求导,也可以通过代码块的限制来停止自动求导。
print(x.requires_grad)
print((x**2).requires_grad)
with torch.no_grad():
print((x**2).requires_grad)
还可以通过.detach()获得一个新的tensor,拥有相同的内容但不需要自动求导
print(x.requires_grad)
y=x.detach()
print(y.requires_grad)
print(x.eq(y).all())
文章图片
推荐阅读
- pytorch|pytorch_lesson2 张量的索引+torch.index_select+torch.view+张量的分片函数+张量的合并操作+张量的维度变换
- 深度学习|【深度学习】Yolov5标签归一化处理——json转换为txt
- 计算机视觉|Faster rcnn 训练自己的数据集 解决方案
- 人工智能|详解预训练模型、信息抽取、文本生成、知识图谱、对话系统技术
- 【深度学习】自然语言处理 --- 理解Google最强NLP模型: BERT
- 人工智能|关于NLP相关技术全部在这里(预训练模型、信息抽取、文本生成、知识图谱、对话系统...)
- 算法|【前沿】陈丹琦团队最新论文(受GPT-3启发,用小样本学习给语言模型做微调,性能最高提升30%...)
- 人工智能|厉害了,比Transformer还好用!
- Paper下载|图像融合综述论文整理