目录
批矩阵乘法-torch.matmul()、torch.bmm()
如果指定维度,返回该维度上的均值,结果Tensor维度减1:
Tensor
Tensors 是一种特殊的数据结构,与 arrays 和 matrices 非常相似。在 PyTorch 中,我们使用张量对模型的输入和输出以及模型的参数进行编码。
Tensor其实就是一个多维数组。
torch.tensor()
运算
索引、切片
- 使用
tensor[start:stop]
取[start, stop)区间内的元素。 start
或stop
为空表示取到边界。- 使用
tensor[start:stop:step]
,step
为步长,控制取值间隔。 - 使用负索引从尾部开始计数,
-1
表示最后一个元素。
对于多维Tensor,使用,
分隔各维度的切片:
改变形状
new_tensor = old_tensor.view(new_shape)
new_shape
为元组,表示新形状。可以有一个维度为-1,代表该维度根据其他维度自动计算。
x = torch.randn()
x中的元素为标准正态分布随机数
torch.zeros()
torch.ones()
PyTorch中常用的数据类型包括
- torch.float32 / torch.float:32位浮点数
- torch.float64 / torch.double:64位浮点数
- torch.float16 / torch.half:16位浮点数
- torch.int8:8位整数
- torch.int16 / torch.short:16位整数
- torch.int32 / torch.int:32位整数
- torch.int64 / torch.long:64位整数
- torch.uint8:8位无符号整数
- torch.bool:布尔值
简单转换
x.item()
x.item()用于获取单元素tensor的python数值。如果不是单元素就会报错。
x.tolist()
x.tolist()用于将tensor转成python列表
tensor的乘法
若两个张量均为一维张量
执行向量点积操作,需要调用torch.dot或torch.matmul函数。
若两个张量均为二维张量
执行矩阵乘法,需要调用torch.mm或torch.matmul函数。
第一个为一维张量与第二个为二维张量
Torch.matmul(不能用torch.mm): 若第一个张量为一维张量,假设维度为[k],第二个张量为二维张量,假设维度为[k,p]。第一个张量会在左边进行维度扩展,维度变为[1,k],然后再进行矩阵乘法,获得维度为[1,p]的张量,然后再去掉扩展的维度,最后结果张量维度为[p]。
第一个为二维张量第二个为一维张量
Torch.matmul(不能用torch.mm): 若第一个张量为二维张量,假设维度为[k,n],第二个张量为一维张量,假设维度为[n]。第二个张量会在右边进行维度扩展,维度变为[n,1],然后再执行矩阵乘法,获得维度为[k,1]的张量,最后再去掉扩展的维度,获得维度为[k]的结果张量。
批矩阵乘法-torch.matmul()、torch.bmm()
如果两个张量的维度均至少为1,且其中至少一个张量维度大于2,那么matmul将执行批矩阵乘法操作:默认使用两个张量的后两维度执行矩阵乘法,其他维度作为batch维。
对于矩阵批量乘法,要求除了最后两个维度相匹配外,其他维度必须全部相同
矩阵的逐元素相乘-torch.mul、*
tensor.mean()
用于计算Tensor所有元素的均值
如果未指定参数,返回所有元素的均值:
x = torch.tensor([1.0, 2.0, 3.0, 4.0])
print(x.mean()) # 输出: tensor(2.5)
如果指定维度,返回该维度上的均值,结果Tensor维度减1:
x = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
print(x.mean(dim=0)) # 输出: tensor([2., 3.])
print(x.mean(dim=1)) # 输出: tensor([1.5, 3.5])
行上的均值就是沿着行上元素的均值,就是每一列上元素的均值
注意:对于整型Tensor,直接调用mean()
会报错,因为默认结果是浮点型。必须先转为浮点型。
torch.reshape()
功能和view()
类似,但可能返回原数据的拷贝
new_tensor = torch.reshape(old_tensor, new_shape)
x = torch.arange(6)
y = torch.reshape(x, (2, 3)) # 改为2x3形状
改变形状的前提是总元素数量不变
torch.squeeze()
torch.squeeze(input, dim=None)
函数用于删除输入Tensor的大小为1的维度
- 如果
dim
参数未指定,那么所有大小为1的维度都将被移除。 - 如果指定
dim
,那么只有在该维度上,如果大小为1,就会被移除。
x = torch.zeros(1, 2, 1, 3, 1)
y = torch.squeeze(x)
print(y.shape) # 输出: torch.Size([2, 3])
z = torch.squeeze(x, 0)
print(z.shape) # 输出: torch.Size([2, 1, 3, 1])
torch.unsqueeze()
用于在指定维度上增加一个大小为1的维度
torch.unsqueeze(input, dim)
input
:输入的Tensor。dim
:插入维度的索引。可以是负数,例如-1表示最后一维。
x = torch.tensor([1, 2, 3, 4])
y = torch.unsqueeze(x, 0)
print(y.shape) # 输出: torch.Size([1, 4])
z = torch.unsqueeze(x, 1)
print(z.shape) # 输出: torch.Size([4, 1])
torch.cat()
torch.cat(tensors, dim=0)
用于沿指定维度连接张量序列
tensors
:Python序列,包含要连接的张量。必须在连接维度以外的所有维度上具有相同的形状。dim
:要沿其连接张量的维度,默认为0。
x = torch.tensor([1, 2, 3])
y = torch.tensor([4, 5, 6])
z = torch.cat([x, y])
print(z) # 输出: tensor([1, 2, 3, 4, 5, 6])
a = torch.tensor([[1, 2, 3], [4, 5, 6]])
b = torch.tensor([[7, 8, 9], [10, 11, 12]])
c = torch.cat([a, b], dim=0)
print(c)
# 输出:
# tensor([[ 1, 2, 3],
# [ 4, 5, 6],
# [ 7, 8, 9],
# [10, 11, 12]])
d = torch.cat([a, b], dim=1)
print(d)
# 输出:
# tensor([[ 1, 2, 3, 7, 8, 9],
# [ 4, 5, 6, 10, 11, 12]])
用于合并具有相同形状的数据。
torch.cat
函数接受的是一个张量的序列,这个序列可以是列表(由方括号定义)或者元组(由圆括号定义)。
tensor与numpy array相互转换
tensor转numpy array
numpy array转tensor
利用GPU来加速训练
首先,需要检查是否有可用的 GPU 来训练:
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") print(device)
如果打印结果为cuda:0,则说明有GPU可用;如果打印结果为cpu,则说明没有。
如果有GPU可用,那么可以将数据转移到GPU上进行训练:
a = a.to(device)