损失函数实现及代码分析

本文详细解析了深度学习中交叉熵损失函数的原理,并提供了在Python环境下实现交叉熵损失函数的代码分析,重点在于理解损失函数在模型训练过程中的作用和计算过程。
摘要由CSDN通过智能技术生成

目录

2021SC@SDUSC

normal_train.py中交叉熵损失函数实现


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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值