python - 为什么我重新加载模型并继续训练损失迅速增加?
问题描述
这是一个类似的问题,但我认为torch
足以处理初始化问题。
让我们先看看损失
# first time save and the loss
epoch:8 loss:2.6038
# second time reload, and save model when epoch is 10
epoch:8 loss:7.8922
epoch:10 loss:4.8546
# third time reload, and save model when epoch is 27
epoch:10 loss:6.0920
epoch:27 loss:2.1613
# fourth time reload and training
epoch:27 loss:6.0920
正如你所看到的,一旦我重新加载模型并运行一个 epoch 训练,损失就会上升而不是下降。这真的很奇怪。
我使用step
由于我的机器无法支持大批量的方法。
- 我第一次使用具有16 个批量大小的四个 GPU,每2 步反向损失一次。.
- 第二次我使用两个具有8 个批量大小的 GPU,每4步向后损失一次
- 第三次我使用 4个批量大小为 16的 GPU,每2 步反向损失一次。.
- 第四次我使用 4个批量大小为 16的 GPU,每2 步反向损失一次。.
根据第一次到第三次,我认为这是batchnorm
问题导致批量大小与参数不同alpha
并且beta
不适合另一组。
但令人惊讶的是,第四次仍然得到类似的情况。所以我真的很困惑。我错过了一些应该保存的参数吗?这是我的加载和重新加载代码。
# saving script
def save_model(self, path, epoch, model, optimizer):
#if epoch % 4 != 0:
# return
if isinstance(model, torch.nn.DataParallel):
state_dict = model.module.state_dict()
else:
state_dict = model.state_dict()
torch.save({
'epoch': epoch,
'model_state_dict': state_dict,
'optimizer_state_dict': optimizer.state_dict(),
'learning_rate':optimizer.state_dict()['param_groups'][0]['lr']
# 'loss': loss
}, path)
# reloading script
def load_model(self, model, optimizer, resume, strict=True):
checkpoint = torch.load(resume, map_location=lambda storage, loc: storage)
print('loaded weights from {}, epoch {}'.format(resume, checkpoint['epoch']))
state_dict_ = checkpoint['model_state_dict']
state_dict = {}
for k in state_dict_:
if k.startswith('module') and not k.startswith('module_list'):
state_dict[k[7:]] = state_dict_[k]
else:
state_dict[k] = state_dict_[k]
model_state_dict = model.state_dict()
if not strict:
for k in state_dict:
if k in model_state_dict:
if state_dict[k].shape != model_state_dict[k].shape:
print('Skip loading parameter {}, required shape{}, ' \
'loaded shape{}.'.format(k, model_state_dict[k].shape, state_dict[k].shape))
state_dict[k] = model_state_dict[k]
else:
print('Drop parameter {}.'.format(k))
for k in model_state_dict:
if not (k in state_dict):
print('No param {}.'.format(k))
state_dict[k] = model_state_dict[k]
model.load_state_dict(state_dict, strict=False)
optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
for state in optimizer.state.values():
for k, v in state.items():
if isinstance(v, torch.Tensor):
state[k] = v.cuda()
epoch = checkpoint['epoch']
# loss = checkpoint['loss']
return model, optimizer, epoch
解决方案
推荐阅读
- python - 使用熊猫数据框不断收到索引错误,现在无法获得正确的值
- microsoft-graph-api - 来自 PS 的 Office 365 图形 API 调用停止工作 (SSPR)
- android - 在kotlin中单击按钮时如何将健康级别降低1?
- ansible - 带有标准输出和变量的 Ansible 条件语句
- ios - 覆盖 Swift 不同模块中的内部符号
- r - R studio:回归循环中的变量均值
- javascript - 如何将多个 api 调用的结果设置为数组 - React
- android - Android - RecyclerView 如何处理具有多个绑定的 ViewHolder
- regex - NNNNNN-N 的正则表达式模式
- javascript - 避免 WooCommerce 中的“未定义 wc_add_to_cart_params”错误