CV入门task4之对模型的训练和验证

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

  • pytorch中的训练模型
  • pytorch中的验证模型
  • 我的调差

前言:深度学习中的流程离不开数据准备,模型设计,误差计算和调参,因此,学会如何在进行模型的训练和验证是深度学习中笔必不可少的环节,本文就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)

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)

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

    model = SVHN_Model1()
    state_dict=torch.load('bsbest.pt')
    model.load_state_dict(state_dict)

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

我的调差

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

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

参考论文


你可能感兴趣的:(CV入门task4之对模型的训练和验证)