目录
2021SC@SDUSC
normal_train.py中交叉熵损失函数实现
设置优化器
optimizer = AdamW(
[
{"params": model.module.bert.parameters(), "lr": args.lrmain},
{"params": model.module.linear.parameters(), "lr": args.lrlast},
])
设置尺度criterion
criterion = nn.CrossEntropyLoss()
test_accs = []
for epoch in range(args.epochs):
train(labeled_trainloader, model, optimizer, criterion, epoch)
val_loss, val_acc = validate(
val_loader, model, criterion, epoch, mode='Valid Stats')
print("epoch {}, val acc {}, val_loss {}".format(
epoch, val_acc, val_loss))
当val_acc的值>=best_acc时,将best_acc的值进行更新,把val_acc的值赋给best_acc
if val_acc >= best_acc:
best_acc = val_acc
test_loss, test_acc = validate(
test_loader, model, criterion, epoch, mode='Test Stats ')
test_accs.append(test_acc)
print("epoch {}, test acc {},test loss {}".format(
epoch, test_acc, test_loss))
print('Best val_acc:')
print(best_acc)
print('Test acc:')
print(test_accs)
对于枚举valloader中每一批数据的输入,标记和长度,进行loss计算
for batch_idx, (inputs, targets, length) in enumerate(valloader):
inputs, targets = inputs.cuda(), targets.cuda(non_blocking=True)
outputs = model(inputs)
loss = criterion(outputs, targets)
计算总体样本和总损失
correct += (np.array(predicted.cpu()) ==
np.array(targets.cpu())).sum()
loss_total += loss.item() * inputs.shape[0]
total_sample += inputs.shape[0]
用设置好的优化器训练模型
def train(labeled_trainloader, model, optimizer, criterion, epoch):
model.train()
for batch_idx, (inputs, targets, length) in enumerate(labeled_trainloader):
inputs, targets = inputs.cuda(), targets.cuda(non_blocking=True)
outputs = model(inputs)
loss = criterion(outputs, targets)
optimizer.zero_grad()
print('epoch {}, step {}, loss {}'.format(
epoch, batch_idx, loss.item()))
loss.backward()
optimizer.step()