网络不能训练,训练集loss不下降,准确率一直是盲猜的结果

最近做对比试验的时候,复现别人很简单的网络结构来对比,但发现它们不能训练,可能存在的主要原因有:
1.学习率设置不当,调整学习率大小,并且检查是否有学习率改变策略
2.可能忘记梯度回传了,检查是否写了loss.back()
3.检查学习率调整策略的函数位置是否放置正确,学习率调整策略的函数要放置在epoch这个for循环下,而不是放置在train那个for循环里,否则学习率会每隔几个batch就衰减一次,很快就接近0,不能训练

    for epoch in range(args.start_epoch, args.epochs):
        adjust_learning_rate(optimizer, epoch) #放置在epoch这个for循环下

        # train for one epoch
        train(train_loader, model, criterion, optimizer, epoch)
        
        # evaluate on validation set
        prec1 = validate(val_loader, model, criterion, epoch)

4.这是我复现别人网络不能训练的原因:没有batchnorm。古早网络都没有加batchnorm,还有一些非cv领域(比如通信),他们设计的神经网络都比较简单,没有batchnorm。
batchnorm的作用有:
1.加快网络的训练和收敛速度
2.控制梯度爆炸防止梯度消失
3.防止过拟合

原论文中说的网络:

class scnn(nn.Module):

    def __init__(self):
        super(scnn, self).__init__()
        self.conv1 = nn.Conv2d(1, 64, kernel_size=3, padding=1, bias=True)
        self.conv2 = nn.Conv2d(64, 32, kernel_size=3, padding=1, bias=True)
        self.conv3 = nn.Conv2d(32, 12, kernel_size=3, padding=1, bias=True)
        self.conv4 = nn.Conv2d(12, 8, kernel_size=3, padding=1, bias=True)
        self.cls = nn.Sequential(
            nn.Flatten(),
            nn.Linear(8*8*8, 54,bias=False),     
        ) 

    def forward(self, x):
        out = F.relu(self.conv1(x))
        out = F.max_pool2d(out, kernel_size=2, stride=2)     
        out = F.relu(self.conv2(out))
        out = F.max_pool2d(out, kernel_size=2, stride=2) 
        out = F.relu(self.conv3(out))
        out = F.max_pool2d(out, kernel_size=2, stride=2)  
        out = F.relu(self.conv4(out))
        out = self.cls(out)
        return out

加上batchnorm后:

class scnn(nn.Module):

    def __init__(self):
        super(scnn, self).__init__()
        self.conv1 = nn.Conv2d(1, 64, kernel_size=3, padding=1, bias=True)
        self.conv2 = nn.Conv2d(64, 32, kernel_size=3, padding=1, bias=True)
        self.conv3 = nn.Conv2d(32, 12, kernel_size=3, padding=1, bias=True)
        self.conv4 = nn.Conv2d(12, 8, kernel_size=3, padding=1, bias=True)
        self.cls = nn.Sequential(
            nn.Flatten(),
            nn.Linear(8*8*8, 54,bias=False),     
        ) 
        self.bn1 = nn.BatchNorm2d(64)
        self.bn2 = nn.BatchNorm2d(32)
        self.bn3 = nn.BatchNorm2d(12)
        self.bn4 = nn.BatchNorm2d(8)
    def forward(self, x):
        out = F.relu(self.bn1(self.conv1(x)))
        out = F.max_pool2d(out, kernel_size=2, stride=2)
        out = F.relu(self.bn2(self.conv2(out)))
        out = F.max_pool2d(out, kernel_size=2, stride=2)
        out = F.relu(self.bn3(self.conv3(out)))
        out = F.max_pool2d(out, kernel_size=2, stride=2)
        out = F.relu(self.bn4(self.conv4(out)))
        out = self.cls(out)
        return out

加上后就可以跑啦!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值