新手搭建自己的神经网络后,在训练过程中可能会遇到以下问题:
第一次epoch训练结束损失降低,在之后的每个epoch训练结束后模型的loss不发生变化。
除了网上的常见的原因外,对于新手还有一个极其难以察觉的代码bug,如下所示
opt_adam = optim.AdamW(model.parameters(), lr=0.1)
lr_sch = optim.lr_scheduler.StepLR(opt_adam, step_size=5, gamma=0.1)
for epoch in range(epochs):
for batch in dataloader:
loss.backward()
opt_adam.step()
epoch_loss += loss.item()
#---------------
lr_sch.step()
#---------------
lr_sch是间隔调整学习率(Step LR)策略,每次调用step(),优化器的last_epoch会+1,当last_epoch%step_size==0的时候,opt_adam的学习率lr就会衰减至原来的0.1倍。
上述代码中,lr_sch.step()会使得lr在每个batch后就会衰减,经过一整个epoch之后,lr已经非常的小了,所以在第二个epoch之后,loss不变,因为lr非常小,导致模型的参数几乎不变。
更正的代码:
opt_adam = optim.AdamW(model.parameters(), lr=0.1)
lr_sch = optim.lr_scheduler.StepLR(opt_adam, step_size=5, gamma=0.1)
for epoch in range(epochs):
for batch in dataloader:
loss.backward()
opt_adam.step()
epoch_loss += loss.item()
#---------------
lr_sch.step()
#---------------
文章出处登录后可见!
已经登录?立即刷新