pytorch之张量

张量 torch.Tensor

torch.Tensor是一种包含单一数据类型元素的多维矩阵。

数据类型Pytorch类型CPU上的张量GPU上的张量
32位浮点数torch.float32
torch.float
torch.FloatTensortorch.cuda.FloatTensor
64位浮点数torch.float64
torch.double
torch.DoubleTensortorch.cuda.DoubleTensor
16位浮点数torch.float16
torch.half
torch.HalfTensortorch.cuda.HalfTensor
8位无符号整数torch.uint8torch.ByteTensortorch.cuda.ByteTensor
8位带符号整数torch.int8torch.CharTensortorch.cuda.CharTensor
16位带符号整数torch.int16
torch.short
torch.ShortTensortorch.cuda.ShortTensor
32位带符号整数torch.int32
torch.int
torch.IntTensortorch.cuda.IntTensor
64位带符号整数torch.int64
torch.long
torch.LongTensortorch.cuda.LongTensor
布尔型torch.booltorch.BoolTensortorch.cuda.BoolTensor

张量的创建

import torch

# torch.Tensor函数创建张量
torch.tensor([1,2,3,4])

# 指定形状生成张量
torch.rand(3,3) #生成3*3的矩阵,矩阵元素服从[0,1)的均匀分布
tensor([[0.2840, 0.3847, 0.3832],
        [0.1252, 0.3213, 0.5853],
        [0.5024, 0.8113, 0.7379]])
        
torch.randn(2,3,4) #生成2*3*4的张量,张量元素服从标准正太分布
tensor([[[-0.2611, -1.8370,  2.0686, -0.4847],
         [ 0.0294,  0.0401, -0.7384, -1.4130],
         [ 0.5026,  1.6850,  0.8888,  0.1861]],

        [[-0.4993, -0.8312,  0.5838, -0.7682],
         [ 0.1210,  0.2984, -0.0603,  0.9805],
         [ 0.1415,  1.0772, -0.3144,  0.2104]]])
         
torch.zeros(2,2,2) #生成2*2*2的张量,张量元素全为0
tensor([[[0., 0.],
         [0., 0.]],

        [[0., 0.],
         [0., 0.]]])
         
torch.ones(1,2,3) #生成1*2*3的张量,张量元素全为1
tensor([[[1., 1., 1.],
         [1., 1., 1.]]])
         
torch.eye(3) #生成3*3的单位矩阵
tensor([[1., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]])
        
torch.randint(0,10,(3,3)) #生成0(包含)到10(不含)之间均匀分布整数的3*3矩阵
tensor([[3, 1, 6],
        [3, 8, 9],
        [3, 4, 5]])


# 通过已知张量创建形状相同的张量

t = torch.randn(3*3)
torch.zeros_like(t) #生成一个元素全为0的张量,形状和t相同
tensor([0., 0., 0., 0., 0., 0., 0., 0., 0.])

torch.ones_like(t) #生成一个元素全为1的张量,形状和t相同
tensor([1., 1., 1., 1., 1., 1., 1., 1., 1.])

torch.rand_like(t) #生成一个服从从[0,1)上均匀分布的张量,形状和给定张量t相同
tensor([0.1028, 0.1721, 0.2348, 0.1490, 0.8338, 0.8679, 0.3076, 0.6863, 0.4816])

torch.randn_like(t) #生成一个元素服从标准正太分布的张量,形状和给定张量t相同
tensor([ 1.2402,  0.0505,  1.6948, -1.1413, -0.0042,  0.3968,  1.7340,  0.3044,
         0.1969])
         
         
# 通过已知张量创建形状不同但数据类型相同的张量

t.new_tensor([1,2,3]).dtype
torch.float32

t.new_zeros(3,3) # 生成相同类型且元素全为0的张量
tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])
        
t.new_ones(3,3) #生成相同类型且元素全为1的张量
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])

张量形状相关函数

t = torch.randn(3,4,5) #生成一个3*4*5的一个张量

t.ndimension() #获取维度的数目
3

t.nelement() #获取该张量的总元素数目
60

t.size() #获取该张量每个维度的大小,调用方法
torch.Size([3, 4, 5])

t.shape #获取该张量每个维度的大小,访问属性
torch.Size([3, 4, 5])

t.size(0) #获取该张量维度为0的大小,调用方法
3

t = torch.randn(12) #产生大小为12的向量

#view()方法不改变底层数据,改变view后张量会改变原来的张量
t.view(3,4) #向量改变形状为3*4的矩阵
tensor([[ 0.3067, -0.4927,  0.2934, -0.9114],
        [ 1.5307, -1.4519,  0.3077,  0.7284],
        [-1.0092, -0.2147,  0.0769,  0.6759]])
        
t.view(-1,4) #第一个维度为-1,pytorch会自动计算改维度的具体值
tensor([[ 0.3067, -0.4927,  0.2934, -0.9114],
        [ 1.5307, -1.4519,  0.3077,  0.7284],
        [-1.0092, -0.2147,  0.0769,  0.6759]])
        
t.data_ptr() #获取张量的数据指针
2821357586624
t.view(3,4).data_ptr() #数据指针不改变
2821357586624
t.view(3,4).transpose(0,1).data_ptr() #transpose方法交换两个维度的步长
2821357586624

张量相关运算API

t1 = torch.rand(3,4) #产生一个3*4的张量
tensor([[0.8076, 0.6687, 0.6467, 0.9070],
        [0.6821, 0.0114, 0.9231, 0.3272],
        [0.5947, 0.1504, 0.8652, 0.1312]])
        
t1.sqrt() #张量的平方根,张量的内部方法
tensor([[0.8987, 0.8178, 0.8041, 0.9524],
        [0.8259, 0.1069, 0.9608, 0.5720],
        [0.7712, 0.3879, 0.9301, 0.3623]])
        
torch.sqrt(t1) #张量的平方根,函数形式
# 前两个不改变张量的值

t1.sqrt_() #平方根原地操作,改变张量的值

torch.sum(t1) #默认对所有元素求和
tensor(6.7154)

torch.sum(t1,0) #对第0维的元素求和
tensor([2.0844, 0.8306, 2.4349, 1.3654])

torch.sum(t1,[0,1]) #对第0,1维的元素求和
tensor(6.7154)

t1.mean() #对所有元素求平均,也可用torch.mean函数
tensor(0.5596)

# 多个张量的运算
t1 = torch.rand(2,3)
t2 = torch.rand(2,3)

t1.add(t2) #加,四则运算,不改变参与运算张量的值
t1.sub(t2) #减
t1.mul(t2) #乘
t1.div(t2) #除

t1.add_(t2) #四则运算,改变参与运算张量的值

张量的极值和排序

t = torch.rand(3,4)
tensor([[0.6086, 0.0281, 0.6543, 0.7071],
        [0.9933, 0.3584, 0.2573, 0.1269],
        [0.3819, 0.6716, 0.2380, 0.6186]])

torch.argmax(t,0) #函数调用,返回沿着第0个维度,极大值所在位置
tensor([1, 2, 0, 0])

t.argmin(1) #内置方法调用,返回沿着第1个维度,极小值所在位置
tensor([1, 3, 2])

torch.max(t,-1) #函数调用,返回沿着最后一个维度,包含极大值和极大值所在位置的元组
torch.return_types.max(
values=tensor([0.7071, 0.9933, 0.6716]),
indices=tensor([3, 0, 1]))

t.min(0) 
torch.return_types.min(
values=tensor([0.3819, 0.0281, 0.2380, 0.1269]),
indices=tensor([2, 0, 2, 1]))

t.sort(-1) #沿着最后一个维度排序,返回排序后的张量和张量元素在该位置的原始位置
torch.return_types.sort(
values=tensor([[0.0281, 0.6086, 0.6543, 0.7071],
        [0.1269, 0.2573, 0.3584, 0.9933],
        [0.2380, 0.3819, 0.6186, 0.6716]]),
indices=tensor([[1, 0, 2, 3],
        [3, 2, 1, 0],
        [2, 0, 3, 1]]))

矩阵乘法和张量的缩并

a = torch.randn(3,4)
b = torch.randn(4,3)

torch.mm(a,b) #矩阵乘法,调用函数,返回3*3的矩阵乘积
a.mm(b) #矩阵乘法,内置方法
a@b #矩阵乘法,@运算符号

torch.bmm(a,b) #(迷你)批次矩阵乘法,返回结果维2*3*3,函数形式
a.bmm(b)
a@b #运算符号形式,根据输入张量的形状决定 调用批次矩阵乘积
troch.einsum("bnk,bkl->bnl",a,b) #einsum函数的结果和a.bmm(b)结果一致

张量的拼接和分割

torch.stack() #通过传入的张量列表,同时指定并创建一个维度,把列表的张量沿着该维度堆叠起来,并返回堆叠以后的张量
torch.cat() #通过传入的张量列表指定某一个维度,把列表中的张量沿着该维度堆叠起来,并返回堆叠以后的张量
torch.split() #返回沿着某个维度分割后的列表
torch.chunk() #传入的整数参数是分割的段数,输入张量在该维度的大小需要被分割的段数整除

t1 = torch.randn(3,4)
t2 = torch.randn(3,4)
t3 = torch.randn(3,4)
t4 = torch.randn(3,2)

torch.stack([t1,t2,t3],-1).shape #沿着一个维度做堆叠,返回大小为3*4*3的张量
torch.Size([3, 4, 3])

torch.cat([t1,t2,t3],-1).shape #沿着一个维度做拼接,返回大小为3*14的张量
torch.Size([3, 12])

t = torch.randn(3,6)

t.split([1,2,3],-1) #把张量沿着最后一个维度分割为三个张量
(tensor([[-0.7143],
        [-0.9957],
        [-0.2261]]), tensor([[ 0.1810,  0.1221],
        [-0.7660, -0.3330],
        [ 0.3290, -0.7981]]), tensor([[ 0.7350, -0.7787, -0.4957],
        [-0.6681, -1.0475,  0.1508],
        [-0.5897,  0.7438, -3.7392]]))
        
t.split(3,-1) #把张量沿着最后一个维度,分割大小为3,输出的张量大小均为3*3
(tensor([[-0.7143,  0.1810,  0.1221],
        [-0.9957, -0.7660, -0.3330],
        [-0.2261,  0.3290, -0.7981]]), tensor([[ 0.7350, -0.7787, -0.4957],
        [-0.6681, -1.0475,  0.1508],
        [-0.5897,  0.7438, -3.7392]]))
        
t.chunk(3,-1) #把张量沿着最后一个维度分割为三个张量,大小均为3*2
(tensor([[-0.7143,  0.1810],
        [-0.9957, -0.7660],
        [-0.2261,  0.3290]]), tensor([[ 0.1221,  0.7350],
        [-0.3330, -0.6681],
        [-0.7981, -0.5897]]), tensor([[-0.7787, -0.4957],
        [-1.0475,  0.1508],
        [ 0.7438, -3.7392]]))

张量维度的扩增和压缩

t = torch.rand(3,4)
t.shape
torch.Size([3, 4])

t.unsqueeze(-1).shape #扩增最后一个维度
torch.Size([3, 4, 1])

t.unsqueeze(-1).unsqueeze(-1).shape #继续扩增最后一个维度
torch.Size([3, 4, 1, 1])


t = torch.rand(1,3,4,1)
t.shape
torch.Size([1, 3, 4, 1])

t.squeeze().shape #压缩所有大小为1的维度
torch.Size([3, 4])
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Strawberry.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值