【Pytorch】常用函数与技巧(重要)

可以作为手册参考【参考:PyTorch常用代码段合集__微信公众号

自己的笔记相关合集

【参考:【深度学习】 Pytorch笔记_myaijarvis的博客-CSDN博客

【参考:【PyTorch深度学习实践】B站视频教程笔记_myaijarvis的博客-CSDN博客

  • 手写数据集(多分类模板)

【参考:【Pytorch从零入门深度学习实战教程】B站_myaijarvis的博客-CSDN博客

  • MLP | Pytorch构建模板

【参考:【PyTorch】学习【深入浅出PyTorch | GitHub】_myaijarvis的博客-CSDN博客

  • FashionMNIST时装分类

out[:,-1,:]与out[:,-1]

bert输出 out:[batch_size,seq_len,hidden_size]
请问out[:,-1,:]与out[:,-1]的维度分别是多少?

假设 “out” 是一个形状为 [batch_size, seq_len, hidden_size] 的张量。

out[:, -1, :]:这将选择每个样本中最后一个时间步的隐藏状态。结果将是一个形状为 [batch_size, hidden_size] 的张量。

out[:, -1]:这将选择每个样本中最后一个时间步的所有元素。由于不指定维度,所以维度将被保留,结果将是一个形状为 [batch_size, hidden_size] 的张量。

因此,out[:, -1, :] 和 out[:, -1] 的维度都是 [batch_size, hidden_size]。

解释一下out[:, -1]

out[:, -1] 表示对张量 out 在第二个维度上进行切片操作,选择每个样本中的最后一个时间步的所有元素。

具体来说,假设 out 的形状为 [batch_size, seq_len, hidden_size],其中 batch_size 表示样本数量,seq_len 表示时间步的数量,hidden_size 表示隐藏状态的维度。

使用 out[:, -1] 操作时,“:” 表示选择所有样本,“-1” 表示选择最后一个时间步。因此,out[:, -1] 将选择每个样本中最后一个时间步的所有元素,结果将是一个形状为 [batch_size, hidden_size] 的张量。

这个操作可以用来提取每个样本的最终隐藏状态或输出,并且在很多情况下,最后一个时间步的隐藏状态包含了模型对整个序列的理解和总结。

max、argmax

【参考:【Pytorch】torch.argmax_myaijarvis的博客-CSDN博客

【参考:torch.argmax与torch.max()的使用方法及区别_蒽,开心(∩_∩)的博客-CSDN博客

torch.max():输出的值有两个参数,第一个参数是最大值,第二个参数是最大值的索引(也就是分类label)


torch.argmax():返回tensor数据最大值的索引

sum,x==y

import torch

x=torch.Tensor([0,0,1,0,1,0])
y=torch.Tensor([0,1,0,0,1,0])

print(x == y)
print((x == y).sum()) # print(torch.sum(x == y)) 计算True的个数
print((x == y).sum().item())

'''
tensor([ True, False, False,  True,  True,  True])
tensor(4)
4
'''

广播机制

【参考:【Pytorch】广播机制_myaijarvis的博客-CSDN博客

其他

【参考:pytorch的广播机制,以及其他函数.size、.item、argmax()、.cpu()、.detach()和.data的使用_YKbsmn的博客-CSDN博客

item()

一个Tensor变量转换为python标量(int、float等)

import torch

x=torch.tensor([1])
print(x.item()) # 1
optimizer.zero_grad()
outputs = model(data)
loss = F.cross_entropy(outputs, label)
#计算这一个batch的准确率
acc = (outputs.argmax(dim=1) == label).sum().cpu().item() / len(labels) #这里也用到了.item()
loss.backward()
optimizer.step()
train_loss += loss.item()   #这里用到了.item()
train_acc += acc

size,shape

size(dim = x)返回的是数据第x维的个数。

import torch
a = torch.tensor([[[0,1,2,3],[10,11,12,13]],[[20,21,22,23],[30,31,32,33]]])

print(a.shape) # torch.Size([2, 2, 4])
print(a.size()) # torch.Size([2, 2, 4])

print(a.shape[0]) # 2

print(a.size()[2]) # 4
print(a.size(2)) # 4 

save,load

【参考:pytorch模型的保存和加载_饕餮&化骨龙的博客-CSDN博客

常用函数

torch.save()
torch.load()
state_dict()
load_state_dict()

定义

import torch

model=...
save_info = {  # 保存的信息
    'iter_num': iter_num,  # 迭代步数
    'optimizer': optimizer.state_dict(),  # 优化器的状态字典
    'model': model.state_dict()  # 模型的状态字典
}
# 保存信息
torch.save(save_info, save_path)


# 载入信息
save_info = torch.load(save_path)
optimizer.load_state_dict(save_info['optimizer'])
model=...
model.load_state_dict(save_info['model'])

detach

【参考:Pytorch-detach用法_维他柠檬可乐的博客-CSDN博客

还未使用过,待定

dataloader,collate_fn

【参考:【Pytorch】collate_fn函数_myaijarvis的博客-CSDN博客

pack_padded_sequence

pad_packed_sequence

只对RNN模型有用

LSTM会对序列中非填充局部和填充局部同等看待,这样会影响模型训练的精度,应该告诉LSTM相关序列的pad情况让LSTM只对非填充局部进行运算。此时,pytorch中的pack_padded_sequ就有了用武之地。

流程:

1.数据先填充,
pad_sequence(
    sequences: Union[Tensor, List[Tensor]],
    batch_first: bool = False,
    padding_value: float = 0.0,
) -> Tensor

2. 送入rnn前把填充的去掉
pack_padded_sequence(
    input: Tensor,
    lengths: Tensor,
    batch_first: bool = False,
    enforce_sorted: bool = True,
) -> PackedSequence

拆开理解:
pack padded_sequence 对已经填充的数据进行 打包压缩(就是去掉填充的) 函数将填充的部分从计算中移除,以提高模型的效率。

pad packed_sequence 对已经打包压缩的数据进行填充

在这里插入图片描述
【参考:【Pytorch】pack_padded_sequence与pad_packed_sequence实战详解_郝同学的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值