复现fcn过程中遇到的问题

第一步:确认输入输出有没有问题

  • 检查各层输出的结果,进一步缩小问题范围
    为检查输出的结果,分别可视化了,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

损失函数

pytorch中损失函数nn.CrossEntropyLoss与激活函数softmax的关系

你可能感兴趣的:(Experiment,python,深度学习)