tensor是一种和numpy很像的数据结构,都是想要操作向量,矩阵,但是tensor是pytorch特有的,而numpy现在是事实上的python矩阵库。tensor被翻译为张量,他最大的特点就是可以被运行在GPU上,而NumPy的NDArray只能运行在CPU上,GPU在加速神经网络运算时很有用,所以,无论是tensorflow还是pytorch都有这个东西。
直接由数组创建
import torch
import numpy as np
data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)
print(x_data)
由numpy转换
np_array = np.array(data)
x_np = torch.from_numpy(np_array)
print(x_np)
我们也可以直接创建特殊的tensor矩阵
size = (2,3)
torch.empty(size)
# 返回形状为size的空tensor
torch.zeros(size)
# 全部是0的tensor
torch.zeros_like(input)
# 返回跟input的tensor一个size的全零tensor
torch.ones(size)
# 全部是1的tensor
torch.ones_like(input)
# 返回跟input的tensor一个size的全一tensor
torch.arange(start=0, end, step=1)
# 返回一个从start到end的序列,可以只输入一个end参数,就跟python的range()一样了。实际上
# PyTorch也有range(),但是这个要被废掉了,替换成arange了
torch.full(size, fill_value)
# 这个有时候比较方便,把fill_value这个数字变成size形状的张量
torch.randn(size)
# 随机一个生成一个tensor
# tensor的属性
tensor = torch.rand(3, 4)
# tensor的大小
print(f"Shape of tensor: {tensor.shape}")
# tensor的数据类型
print(f"Datatype of tensor: {tensor.dtype}")
# tensor存储的地方 CPU or GPU
print(f"Device tensor is stored on: {tensor.device}")
# 将tensor转移到GPU
if torch.cuda.is_available():
tensor = tensor.to("cuda")
print("tensor is moved to GPU")
tensor的切片,和numpy或者list的操作很像
tensor = torch.ones(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)
t1 = torch.cat([tensor, tensor, tensor], dim=1)
print(t1)
矩阵的乘法或者除法运算
# 这个就是数学意义上的乘法
y1 = tensor @ tensor.T
y2 = tensor.matmul(tensor.T)
y3 = torch.rand_like(y1)
torch.matmul(tensor, tensor.T, out=y3)
# 下面乘法相当于是点乘,也就是每个对应位置元素元素乘以每个元素
z1 = tensor * tensor
z2 = tensor.mul(tensor)
z3 = torch.rand_like(tensor)
torch.mul(tensor, tensor, out=z3)
求和运算
agg = tensor.sum()
agg_item = agg.item()
print(agg_item, type(agg_item))
加法运算
# 所有元素全部加一
tensor.add_(1)
print(tensor)
# 当然也可以直接相加
a = torch.rand((2,3))
b = torch.rand((2,3))
c = a + b
print(c)