Tensor初识

我们发现,目前认识的几种数据表示:标量,向量,矩阵是有着联系的,标量可以组合成向量,向量可以组合成矩阵。那么,我们可否将它们看作是一种数据形式呢?答案是可以的,这种统一的数据形式,在 PyTorch 中我们称之为**张量 (Tensor)**。

Tensor的创建

直接创建

1
torch.tensor(data, dtype=None, device=None, requires_grad=False)

data是要传入的数据,可以传入list, tuple, numpy array, scalar等,均可以转为tensor

dtype是tensor的类型

device指定数据要返回的设备,暂时不用关注

requires_grad指定当前量是否需要在计算中保留对应的梯度信息在 PyTorch 中,只有当一个 Tensor 设置 requires_grad 为 True 的情况下,才会对这个 Tensor 以及由这个 Tensor 计算出来的其他 Tensor 进行求导,然后将导数值存在Tensor 的 grad 属性中,便于优化器来更新参数。

所以,你需要注意的是,把 requires_grad 设置成 true 或者 false 要灵活处理。如果是训

练过程就要设置为 true,目的是方便求导、更新参数。而到了验证或者测试过程,我们的

目的是检查当前模型的泛化能力,那就要把 requires_grad 设置成 Fasle,避免这个参数

根据 loss 自动更新

从numpy创建

1
torch.from_numpy(ndarray)

创建特殊形式的Tensor

全零矩阵

1
torch.zeros(size, dtype=None...)

全1矩阵

1
torch.ones(size, dtype=None...)

单位矩阵

1
torch.eye(size, dtype=None)

随机矩阵

1
2
3
4
torch.rand(size)
torch.randn(size)
torch.normal(size, mean, std)
torch.randint(low, high, size)

torch.rand 用于生成数据类型为浮点型且维度指定的随机 Tensor,随机生成的浮点数据在 0~1 区间均匀分布

torch.randn 用于生成数据类型为浮点型且维度指定的随机 Tensor,随机生成的浮点数的取值满足均值为 0、方差为 1 的标准正态分布

torch.normal 用于生成数据类型为浮点型且维度指定的随机 Tensor,可以指定均值和标准差

torch.randint 用于生成随机整数的 Tensor,其内部填充的是在[low,high) 均匀生成的随机整数。

Tensor的转换

int与tensor

1
2
a = torch.Tensor(1)
b = a.item()

list与tensor

1
2
3
a = [1, 2, 3]
b = torch.Tensor(a)
c = b.numpy().tolist()

CPU与GPU的Tensor转换

1
2
CPU->GPU: data.cuda()
GPU->CPU: data.cpu()

Tensor的常用操作

获取形状

1
2
a = tensor.zero(2, 3, 5)
a.shape或a.size()

a.numel()可以直接获得元素数量

维度转换&形状转换

permute函数或者transpose函数可以用来实现交换不同维度的数据

transpose每次只能转置两个维度

1
2
x = x.permute(2, 1, 0)	//	0维度和2维度换位置
或者x = x.transpose(0, 2)

view函数reshape函数可以用来实现形状的转换

1
2
x = x.reshape(2, 4)
x = x.view(2, 4)

Tip: 如果之前用过形状转换等或者其他函数使得tensor存放的数据在内存中不连续,那么可以使用reshape函数

增减维度

unsqueeze和squeeze函数可以实现增减维度(需要指定增减的维度为1),否则返回原tensor

1
y = x.squeeze(1)	//	将x的第1维度删除

unsqueeze同理

Tensor的连接操作