- 常看:
总结的非常好 【参考:学习python/pytorch过程中遇到的知识点_gailj的博客-CSDN博客】
可以作为手册参考【参考: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博客】