【Pytorch】11.损失函数与梯度下降

模型引入损失函数

主要介绍三种

  • L1Loss
  • MSELoss(平方损失函数)
  • CrossEntropyLoss(交叉熵损失函数)

L1Loss

在这里插入图片描述
在这里插入图片描述
对于训练得出的结果和实际的结果target的作差绝对值作为损失,分为两种情况

  • 求出的形式为平均值形式mean
  • 求出的形式为和的形式sum
    这个形式可以在reduction中指定,默认为平均值mean形式
    在这里插入图片描述
    我们可以看到其他的两个类的初始化参数已经废弃了,就reduction还在使用了
    在这里插入图片描述
    我们可以看到需要inputtarget同维度,使用方法为
loss = nn.L1Loss()
input = torch.randn(3, 5, requires_grad=True)
target = torch.randn(3, 5)
output = loss(input, target)
output.backward()

MSELoss

为平方损失函数
在这里插入图片描述
具体的定义与L1Loss相似,唯一的区别就是损失函数的计算变成了input和target差值的平方(L1是差值的绝对值)

CrossEntropyLoss

为交叉熵损失函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

具体的公式定义为
x[class]代表预测正确的概率class可以等同于我们之前的target

在这里插入图片描述
也分为平均值mean总和sum的方式
使用方法为

>>> loss = nn.CrossEntropyLoss()
>>> input = torch.randn(3, 5, requires_grad=True)
>>> target = torch.empty(3, dtype=torch.long).random_(5)
>>> output = loss(input, target)
>>> output.backward()

梯度下降

当我们求得模型的损失函数后,使用backward()方法可以计算出本次参数更新的梯度值,这时候我们就需要使用梯度下降来对我们的模型参数进行更新了,而在Pytorch中,我们主要是通过torch.optim中的优化器算法来进行梯度下降的

optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr=0.0001)

上面给出了优化器中的两种算法SGDAdam,其中我们主要讲解一下SGD
在这里插入图片描述
其中两个参数是所有优化器所必需的

  • params 是我们创建的神经网络的参数
  • lr 代表learn rate,使我们梯度下降的学习率
    而其他的参数都是不同的优化器算法所特有的

损失函数和梯度下降的具体代码实现

net = Net()
criterion = nn.CrossEntropyLoss()  # 损失函数
optim = torch.optim.SGD(net.parameters(), lr=0.1)

# 将整个CIFAR10数据集进行20次循环训练
for epoch in range(20):
    res_loss = 0.0
    for data in dataLoader:
        optim.zero_grad()
        img, target = data
        output = net(img)  # 模型经过CNN后得出的概率值
        loss = criterion(output, target)  # 根据从模型训练出来的概率值与目标值target进行交叉熵损失函数求解
        loss.backward()  # 计算本次参数的梯度
        optim.step()
        res_loss = res_loss + loss
    print(res_loss)

上面代码为训练20次的神经网络代码

加入CIFAR10模型

import torch
import torchvision
from torch import nn
from torch.utils.tensorboard import SummaryWriter

dataset = torchvision.datasets.CIFAR10('./dataset', train=False, download=True,
                                       transform=torchvision.transforms.ToTensor())

dataLoader = torch.utils.data.DataLoader(dataset, batch_size=64)


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 32, kernel_size=5, padding=2)
        self.pool1 = nn.MaxPool2d(2)
        self.conv2 = nn.Conv2d(32, 32, kernel_size=5, padding=2)
        self.pool2 = nn.MaxPool2d(2)
        self.conv3 = nn.Conv2d(32, 64, kernel_size=5, padding=2)
        self.pool3 = nn.MaxPool2d(2)
        self.flatten = nn.Flatten()
        self.fc1 = nn.Linear(1024, 64)
        self.fc2 = nn.Linear(64, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = self.pool1(x)
        x = self.conv2(x)
        x = self.pool2(x)
        x = self.conv3(x)
        x = self.pool3(x)
        x = self.flatten(x)
        x = self.fc1(x)
        x = self.fc2(x)
        return x


net = Net()
criterion = nn.CrossEntropyLoss()  # 损失函数
optim = torch.optim.SGD(net.parameters(), lr=0.1)

# 将整个CIFAR10数据集进行20次循环训练
for epoch in range(20):
    res_loss = 0.0
    for data in dataLoader:
        optim.zero_grad()
        img, target = data
        output = net(img)  # 模型经过CNN后得出的概率值
        loss = criterion(output, target)  # 根据从模型训练出来的概率值与目标值target进行交叉熵损失函数求解
        loss.backward()  # 计算本次参数的梯度
        optim.step()
        res_loss = res_loss + loss
    print(res_loss)

运行结果为:
在这里插入图片描述

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值