Pytorch:Tensor(张量)的使用

本文深入介绍了PyTorch中的张量操作,包括张量的属性、初始化方法,如从列表、Numpy数组转换,以及随机和常数值创建。还详细阐述了张量的硬件位置改变、数据访问、合并、矩阵运算、按位相乘、求和、就地操作等,并展示了与Numpy之间的无缝转换。通过实例代码,帮助读者全面掌握PyTorch张量的使用技巧。
摘要由CSDN通过智能技术生成

张量是一种特殊的数据结构,与数组和矩阵非常相似。在 PyTorch 中,我们使用张量来编码模型的输入和输出,以及模型的参数。

张量的属性

分别是形状,数据类型和所在硬件位置。

tensor = torch.rand(3,4)

print(f"Shape of tensor: {tensor.shape}")
print(f"Datatype of tensor: {tensor.dtype}")
print(f"Device tensor is stored on: {tensor.device}")

在这里插入图片描述

张量的初始化

从列表转换

data=[[1,2],[3,4]]
data=torch.tensor(data)
print(data)

在这里插入图片描述

从Numpy的array转换

import numpy as np
data=[[1,2],[3,4]]
np_array=np.array(data)
data=torch.from_numpy(np_array)
print(data)

在这里插入图片描述

从另一个张量转换

使用XXX_like可以在用另一个张量的大小和变量类型初始化新张量,如果想改变新张量的变量类型,在转换函数中可以设置。

import numpy as np
data=[[1,2],[3,4]]
np_array=np.array(data)
data=torch.from_numpy(np_array)
data_ones=torch.ones_like(data)
data_rand=torch.rand_like(data,dtype=torch.float)
print(data)
print(data_ones)
print(data_rand)

在这里插入图片描述

随机或常数值

shape = (2,3)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)

print(f"Random Tensor: \n {rand_tensor} \n")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor}")

在这里插入图片描述

张量的操作

更改所在硬件

默认情况下,新声明的张量都在CPU上,如果想用GPU加速运算,可以将张量从CPU移到GPU上,前提是你的pytorch支持GPU,可以通过torch.cuda.is_available()来查看:
在这里插入图片描述
如果可用,我们就能把张量移动到GPU上,也可以用同样的函数移回CPU,注意在硬件设备间转移数据的成本可能会比较高。

tensor=torch.rand(4,4)
print(tensor.device)
tensor=tensor.to("cuda")
print(tensor.device)
tensor=tensor.to("cpu")
print(tensor.device)

在这里插入图片描述

数据访问

对于二维的张量,可以通过第一个索引访问行,第二个参数访问列,且支持...:直接访问一整行/列的数据。

tensor = torch.rand(4, 4)
print(f"First row: {tensor[0]}")
print(f"First column: {tensor[..., 0]}")
print(f"Last column: {tensor[:, -1]}")
tensor[:,1] = 0
print(tensor)

在这里插入图片描述

合并张量

使用torch.cat()函数,同时用dim指定要合并的维度。

t1 = torch.cat([tensor, tensor, tensor], dim=0)
print(t1)

在这里插入图片描述

矩阵乘法

矩阵乘法的写法有三种:

y1 = tensor @ tensor.T
y2 = tensor.matmul(tensor.T)

y3 = torch.rand_like(tensor)
torch.matmul(tensor, tensor.T, out=y3)

print(y1,y2,y3,sep='\n')

在这里插入图片描述

矩阵按位相乘

也有三种:

z1 = tensor * tensor
z2 = tensor.mul(tensor)

z3 = torch.rand_like(tensor)
torch.mul(tensor, tensor, out=z3)

print(z1,z2,z3,sep='\n')

在这里插入图片描述

求和

可以通过sum()对张量中的元素求和,但求出的值是装在张量里的,可以通过item将只有一个元素的张量转化为普通的Python数据类型。

sum = tensor.sum()
sum_item = sum.item()
print(type(sum),sum_item, type(sum_item))

在这里插入图片描述

就地操作

就地操作会更改张量的值,这类函数都以_结尾,比如加常数、转置等……

tensor=torch.rand([2,3])
print(tensor,end='\n')
tensor.add_(2)
print(tensor,end='\n')
tensor.t_()
print(tensor,end='\n')

在这里插入图片描述

与Numpy联动

CPU上的张量和NumPy数组可以共享它们的底层内存位置,改变一个会改变另一个。

由张量到numpy

t = torch.ones(5)
print(f"t: {t}")
n = t.numpy()
print(f"n: {n}")
t.add_(1)
print(f"t: {t}")
print(f"n: {n}")

在这里插入图片描述

由numpy到张量

n = np.ones(5)
t = torch.from_numpy(n)
np.add(n, 1, out=n)
print(f"t: {t}")
print(f"n: {n}")

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ShadyPi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值