对街景字符的模型和验证的说明
前言:深度学习中的流程离不开数据准备,模型设计,误差计算和调参,因此,学会如何在进行模型的训练和验证是深度学习中笔必不可少的环节,本文就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,比较有用效果
对于网络结构的有化,运用relu,dropout的方法在网络结构上
在计算资源,能力不足的情况,没能够调参调的非常好,希望继续加油