Pytorch教程01 - Pytorch安装,基本元素操作,切片,改变张量形状,clamp张量裁剪
pytorch一站式学习->: pytorch一站式学习,张量基本操作,神经网络基本概念与搭建集合
python一站式学习->: python一站式学习,python基础,数据类型,numpy,pandas,机器学习,NLP自然语言处理,deepseek大预言模型,Tensorflow,CV视觉
pytorch是基于Numpy的科学计算包,作为深度学习的平台,提供了最大的灵活度和速度,并提供使用GPU强大功能的能力
pytorch安装
官网地址 https://pytorch.org/get-started/locally/
进入官网安装教程页面,根据自己系统环境,选择运行不同的安装命令
# cpu计算平台安装
pip3 install torch torchvision torchaudio
# GPU计算平台安装,cuda版本12.6
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126
Tensors张量
Tensors类似于Numpy中的ndarray数据结构,最大区别是Tensor可以使用GPU加速计算。
基本元素操作
- 生成一个张量
import torch
# 1. 创建一个空3行2列的tensor,有值是因为默认会把内存中的值随机赋值,该值没有任何意义
torch.empty(3,2)
# 结果:tensor([[9.4397e+18, 1.3060e-42],
# [0.0000e+00, 0.0000e+00],
# [0.0000e+00, 0.0000e+00]])
# 2. 生成一个3行2列,0-1之间的随机分布张量数据
torch.rand(3,2)
# 结果:tensor([[0.4362, 0.7062],
# [0.5299, 0.7610],
# [0.3549, 0.3182]])
# 3. 生成一个3行2列,0-1之间的正太分布张量数据
torch.randn(3,2)
#结果:tensor([[-0.2598, -0.5116],
# [ 0.4263, -1.1537],
# [ 0.2921, -0.6076]])
# 4. 生成一个3行2列全0矩阵
# dtype=torch.double指定数据类型
torch.zeros(3,2,dtype=torch.long)
# 结果:tensor([[0, 0],
# [0, 0],
# [0, 0]])
# 5. 生成一个3行2列全1矩阵
# dtype=torch.long指定数据类型
torch.ones(3,2,dtype=torch.float)
# 结果:tensor([[1., 1.],
# [1., 1.],
# [1., 1.]])
# 6. 使用正太分布生成一个形状和x一样的张量
torch.randn_like(x ,dtype=torch.float)
# 结果: tensor([[-1.3119, 0.0489],
# [ 0.3093, -0.0307],
# [-0.1648, -1.7262]])
# 7. 使用现有数据生成一个矩阵
torch.tensor([1.2,2.3])
# 结果:tensor([1.2000, 2.3000])
# 8. 填充值为4
a = torch.full((2,3),4)
print(a)
# 结果tensor([[4, 4, 4],[4, 4, 4]])
- 获取张量的尺寸
y= torch.tensor([[1.2,2.3,5.2],[1.5,3.2,4.0]])
# size() 返回的是一个tuple元祖,因此支持一切元祖的操作
print(y.size())
# 结果:torch.Size([2, 3])
切片
和numpy中切片语法一致,这里举几个例子
import torch
x= torch.tensor([[1,2,3],[4,5,6]])
# 所有列,取一行切片
print(x[:1])
#tensor([[1, 2, 3]])
# 所有行,第一列切片
print(x[:,0])
#tensor([1, 4])
# 所有行,第一到第二列
print(x[:,:2])
#tensor([[1, 2],
# [4, 5]])
torch.chunk(a,2,dim=0)切片
将a按照dim=0行切分成2份,如果行除不尽,最后一个张量会小
代码示例
import torch
if __name__ == '__main__':
a = torch.linspace(1,12,12).view(3,4)
print("张量a:",a)
# dim=0按照行切分,dim=1按照列切分
out = torch.chunk(a,2,dim=0)
print("张量out:",out)
# 结果
张量a: tensor([[ 1., 2., 3., 4.],
[ 5., 6., 7., 8.],
[ 9., 10., 11., 12.]])
张量out: (tensor([[1., 2., 3., 4.],
[5., 6., 7., 8.]]),
tensor([[ 9., 10., 11., 12.]]))
torch.split()
- 方式一: torch.split(a,2,dim=0) 将张量按照行切分,每份有2行,一共切出来几个tensor 由行数除以2决定
- 方式二 : torch.split(a,[2,3],dim=0)将张量按照行切分,切割的行数按照[2,3]数组分别决定
代码示例
import torch
if __name__ == '__main__':
a = torch.linspace(1,15,15).view(5,3)
print("张量a:",a)
# 方式一 将张量按照行切分,每份有2行,一共切出来几个tensor 由行数除以2决定
out = torch.split(a,2,dim=0)
print("方式一:张量out1:",out)
# 方式二 将张量按照行切分,切割的行数按照[2,3]数组分别决定
out2 = torch.split(a,[2,3],dim=0)
print("方式二:张量out2:",out2)
结果
张量a: tensor([[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 9.],
[10., 11., 12.],
[13., 14., 15.]])
方式一:张量out1: (tensor([[1., 2., 3.],
[4., 5., 6.]]), tensor([[ 7., 8., 9.],
[10., 11., 12.]]), tensor([[13., 14., 15.]]))
方式二:张量out2: (tensor([[1., 2., 3.],
[4., 5., 6.]]), tensor([[ 7., 8., 9.],
[10., 11., 12.],
[13., 14., 15.]]))
改变张量的形状
view改变形状,必须元素总个数一致
import torch
x= torch.tensor([[1,2,3],[4,5,6]])
# 一行,元素总个数必须一致
y = x.view(6)
# -1自动匹配行,2列
z = x.view(-1,2)
print(x.size(),y.size(),z.size())
# 结果:torch.Size([2, 3]) torch.Size([6]) torch.Size([3, 2])
单值获取值
import torch
# 如果张量只有一个元素,可以使用item()将值取出,作为python的number
x= torch.tensor([6])
print(x.item())
# 结果: 6
clamp张量裁剪
在深度学习时候,经常需要对张量数值约束在一个范围内,可以使用a.clamp(n,m) ,当张量a中元素小于n的用n替换,大于m的用m替换,之间的保持不变
代码示例
import torch
if __name__ == '__main__':
a = torch.rand(2,3)*10
print("裁剪前张量a:",a)
a.clamp_(3,6)
print("裁剪后张量a:",a)
结果
裁剪前张量a: tensor([[9.8905, 0.7338, 5.0934],
[4.3329, 5.3238, 4.9667]])
裁剪后张量a: tensor([[6.0000, 3.0000, 5.0934],
[4.3329, 5.3238, 4.9667]])