Pytorch的基本使用

目录

Tensor

torch.tensor()

运算

 索引、切片

改变形状 

 torch.zeros()

 torch.ones()

 PyTorch中常用的数据类型包括

简单转换

x.item()

 x.tolist()

 tensor的乘法

若两个张量均为一维张量

 若两个张量均为二维张量

 第一个为一维张量与第二个为二维张量

 第一个为二维张量第二个为一维张量

 批矩阵乘法-torch.matmul()、torch.bmm()

 矩阵的逐元素相乘-torch.mul、*

 tensor.mean()

如果未指定参数,返回所有元素的均值:

如果指定维度,返回该维度上的均值,结果Tensor维度减1:

torch.reshape()

torch.squeeze()

torch.unsqueeze()

torch.cat()

tensor与numpy array相互转换

tensor转numpy array

 numpy array转tensor

 利用GPU来加速训练


Tensor

Tensors 是一种特殊的数据结构,与 arrays 和 matrices 非常相似。在 PyTorch 中,我们使用张量对模型的输入和输出以及模型的参数进行编码。

Tensor其实就是一个多维数组。

torch.tensor()

运算

 索引、切片
  • 使用tensor[start:stop]取[start, stop)区间内的元素。
  • startstop为空表示取到边界。
  • 使用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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值