第一步:确认输入输出有没有问题
- 检查各层输出的结果,进一步缩小问题范围
为检查输出的结果,分别可视化了,vgg_backbone特征层输出、 fcn-8s head的输出、在vgg_backbone特征层可视化输出时后面几层看不清,于是做了归一化处理 - 检查预训练模型参数是否加载进去——比较预训练模型的参数和你加载预训练模型之后的参数是否一致:从vgg16-397923af.pth里读取的数值应该和加载预训练模型后model.load_state_dict参数一致
不一致的原因可能是:在载入参数到模型键值的不匹配,使用了strict=False造成的。参数名的映射,小心使用strict=False
学习率的问题:
用一个很小的学习率迭代几百次找到一个位置,然后再调到一个正常的lr。为了给模型找到一个比较好的初始化位置,为了避免模型只达到局部最优。
先普普通通用固定学习率,经过一段epochloss不下降之后,进行学习率衰减。
# 当验证集的损失连续3个epoch没有下降时,将学习率除以2,然后继续训练
lr_counter = 0 # 初始化学习率计数器
best_loss = float('inf') # 初始化最佳loss值
"""
for epoch in range(start_epoch+1, args.epochs+1):
count_step = (epoch-1)*len(train_loader)
# adjust_learning_rate(optimizer, epoch, args)
mean_loss, lr = train_one_epoch(model, optimizer, train_loader, device, epoch, count_step,writer,
print_freq=args.print_freq)
val_info = evaluate_vgg(model, epoch, val_loader, device, writer, num_classes=num_classes)
"""
if mean_loss < best_loss:
best_loss = mean_loss
lr_counter = 0 # 重置学习率计数器
else:
lr_counter += 1 # 记录 loss 没有下降的 epoch 数
# 根据学习率计数器的值进行学习率衰减
if lr_counter > 2:
adjust_learning_rate(optimizer, decay=0.5)
lr_counter = 0 # 重置学习率计数器
def adjust_learning_rate(optimizer, decay):
"""decay learning rate to the last LR"""
for param_group in optimizer.param_groups:
param_group['lr'] = param_group['lr'] * decay