模型优化器
optimizer.step()和scheduler.step()的区别
optimizer.step()通常用在每个mini-batch之中,而scheduler.step()通常用在epoch里面,但是不绝对,可以根据具体的需求来做。只有用了optimizer.step(),模型才会更新,而scheduler.step()是对学习率 learning rate 进行调整。
optimizer.zero_grad 和 loss.backward 顺序
optimizer.zero_grad(set_to_none=True) # 清零梯度,或者换成None
loss.backward() # 反向传播,计算梯度
optimizer.step() # 更新模型参数
模型初始权重
默认的初始化方法通常是比较简单的随机初始化,例如从均匀分布或正态分布中随机抽取权重值。
显式初始化方法:
torch.nn.init.xavier_uniform_
: Xavier/Glorot初始化,适用于Sigmoid和Tanh等激活函数。torch.nn.init.xavier_normal_
: Xavier/Glorot初始化,适用于Sigmoid和Tanh等激活函数。torch.nn.init.kaiming_uniform_
: Kaiming/He初始化,适用于ReLU激活函数。torch.nn.init.kaiming_normal_
: Kaiming/He初始化,适用于ReLU激活函数如果模型不够复杂,可能默认的初始化方法已经足够。然而,对于更深层次或者需要更好的训练效果的模型,显式使用初始化方法是一个好的选择,可以提高模型的性能和稳定性。
模型Normalization
建议调用NN后,进行Batch/Layer Nomalization,再激活函数
加载多个dataloader
使用tqdm
# 两个dataloader长度一致
loader = zip(train_dataloader,train_dataloader_new)
batch_iterator = tqdm(loader, total=len(train_dataloader), desc=f'Processing epoch {epoch:02d}')
for (batch_old, batch_new) in batch_iterator:
不使用tqdm
# 如果两个dataloader长度一样
for (i, data) in enumerate( zip( dataloader1, dataloader2 ) ):
#如果两个dataloader长度不一样
from itertools import cycle
for (i, data) in enumerate( zip( cycle(dataloader1), dataloader2 ) ):
***仅使用zip,迭代器将在长度等于最小数据集的长度时耗尽。 但是,使用cycle时,我们将再次重复最小的数据集,除非迭代器查看最大数据集中的所有样本。