张量是一种特殊的数据结构,与数组和矩阵非常相似。在 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}")