前言:深度学习中的流程离不开数据准备,模型设计,误差计算和调参,因此,学会如何在进行模型的训练和验证是深度学习中笔必不可少的环节,本文就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)
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)
在实例化模型之后调用之前学过,训练的时间就减少了
之前一直没有调参经验,还有算力不够,基于这次模型的调参我是进行这几个方面的调试
参考论文