当前位置:   article > 正文

CV入门task4之对模型的训练和验证_for i, (input, target) in enumerate(train_loader):

for i, (input, target) in enumerate(train_loader): 调试

对街景字符的模型和验证的说明

前言:深度学习中的流程离不开数据准备,模型设计,误差计算和调参,因此,学会如何在进行模型的训练和验证是深度学习中笔必不可少的环节,本文就pytorch的模型训练和验证给出相应的代码,并简述一下我的调参经验

pytorch中的训练模型

def train(train_loader, model, criterion, optimizer, epoch):
    # 切换模型为训练模式
    model.train()
    train_loss = []

    for i, (input, target) in enumerate(tqdm(train_loader)):
        if use_cuda:
            input = input.cuda()
            target = target.cuda()
            print("cuda is ok")
            c0, c1, c2, c3, c4 = model(input)
        else:
            print("cuda is not done")
        target = target.long()
        loss = criterion(c0, target[:, 0]) + \
               criterion(c1, target[:, 1]) + \
               criterion(c2, target[:, 2]) + \
               criterion(c3, target[:, 3]) + \
               criterion(c4, target[:, 4])

        # loss /= 6
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        train_loss.append(loss.item())
    return np.mean(train_loss)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

pytorch中的验证模型

def validate(val_loader, model, criterion):
    # 切换模型为预测模型
    model.eval()
    val_loss = []

    # 不记录模型梯度信息
    with torch.no_grad():
        for i, (input, target) in enumerate(tqdm(val_loader)):
            if use_cuda:
                input = input.cuda()
                target = target.cuda()

            c0, c1, c2, c3, c4 = model(input)
            target = target.long()
            loss = criterion(c0, target[:, 0]) + \
                   criterion(c1, target[:, 1]) + \
                   criterion(c2, target[:, 2]) + \
                   criterion(c3, target[:, 3]) + \
                   criterion(c4, target[:, 4])
            # loss /= 6
            val_loss.append(loss.item())
    return np.mean(val_loss)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

这里我在经过了非常久的训练后发现,在训练完后中断后,再次训练没有’调用’这个之前训练完的参数会从头开始训练,对于网络的优化的时间又要更久一些,因此我在这里就调用我之前训练后保存的模型,来减少悬链的这里我为了保存模型和调用学到的模型,在

    model = SVHN_Model1()
    state_dict=torch.load('bsbest.pt')
    model.load_state_dict(state_dict)
  • 1
  • 2
  • 3

在实例化模型之后调用之前学过,训练的时间就减少了

我的调差

之前一直没有调参经验,还有算力不够,基于这次模型的调参我是进行这几个方面的调试

  • 首先,最为简单的就是调大batch_size,调到gpu能够选到的范围
    *对于学习率,在这个比赛,基于自己的情况,能够有足够的训练次数时,先是学习率的步长大一些观察训练的损失情况,然后在可以选择对学习率的调整,然后在后面学习率调小一些,具体可以参考这篇博客
    还有就是用“cosine” decay,比较有用效果
    hellworld
    对于网络结构的有化,运用relu,dropout的方法在网络结构上
    在计算资源,能力不足的情况,没能够调参调的非常好,希望继续加油

参考论文


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/101797
推荐阅读
相关标签
  

闽ICP备14008679号