Pytorch学习笔记——损失函数的综合运用

1. 基本损失函数

平均绝对误差(L1损失)

import torch
from torch import nn

# 示例输入和目标张量
input = torch.tensor([1, 1, 3], dtype=torch.float32)
target = torch.tensor([1, 1, 5], dtype=torch.float32)

# 将张量重塑为预期的维度(N, C, H, W)
input = torch.reshape(input, (1, 1, 1, 3))
target = torch.reshape(target, (1, 1, 1, 3))

# 定义L1损失函数
loss1 = nn.L1Loss()
output = loss1(input, target)
print("L1损失:", output.item())

均方误差(MSE损失)

# 定义MSE损失函数
loss2 = nn.MSELoss()
output = loss2(input, target)
print("MSE损失:", output.item())

得到的结果如下
在这里插入图片描述

2. 计算原理

L1损失函数的公式如下:
L1 Loss = 1 n ∑ i = 1 n ∣ x i − y i ∣ \text{L1 Loss} = \frac{1}{n} \sum_{i=1}^{n} |x_i - y_i| L1 Loss=n1i=1nxiyi
输入和目标张量分别是 input = [1, 1, 3]target = [1, 1, 5]。计算步骤如下:

  1. 计算每个元素的绝对差异:
    ∣ 1 − 1 ∣ = 0 , ∣ 1 − 1 ∣ = 0 , ∣ 3 − 5 ∣ = 2 |1 - 1| = 0, |1 - 1| = 0, |3 - 5| = 2 ∣11∣=0,∣11∣=0,∣35∣=2
  2. 计算平均绝对差异:
    L1 Loss = 2 3 ≈ 0.6667 \text{L1 Loss} = \frac{2}{3} \approx 0.6667 L1 Loss=320.6667

均方误差损失函数的公式如下:
MSE Loss = 1 n ∑ i = 1 n ( x i − y i ) 2 \text{MSE Loss} = \frac{1}{n} \sum_{i=1}^{n} (x_i - y_i)^2 MSE Loss=n1i=1n(xiyi)2
目标张量分别是 input = [1, 1, 3]target = [1, 1, 5]。计算步骤如下:

  1. 计算每个元素的平方差异:
    ( 1 − 1 ) 2 = 0 ( 1 − 1 ) 2 = 0 ( 3 − 5 ) 2 = 4 (1 - 1)^2 = 0 (1 - 1)^2 = 0 (3 - 5)^2 = 4 (11)2=0(11)2=0(35)2=4
  2. 计算平均平方差异:
    MSE Loss = 4 3 ≈ 1.3333 \text{MSE Loss} = \frac{4}{3} \approx 1.3333 MSE Loss=341.3333

3. 使用CIFAR-10的卷积神经网络的综合运用实例

结合之前的知识,构建一个简单的CNN模型来分类CIFAR-10数据集中的图像。

导入必要的库和数据

import torchvision
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Linear, Flatten, Sequential
from torch.utils.data import DataLoader

# 下载并加载CIFAR-10数据集
dataset = torchvision.datasets.CIFAR10(root="data1", train=False, transform=torchvision.transforms.ToTensor(), download=True)
# 使用DataLoader加载数据
dataloader = DataLoader(dataset, batch_size=64)

定义卷积神经网络

class NN(nn.Module):
    def __init__(self):
        super(NN, self).__init__()
        self.model1 = Sequential(
            Conv2d(3, 32, 5, padding=2),  # 第一次卷积
            MaxPool2d(2),  # 第一次最大池化
            Conv2d(32, 32, 5, padding=2),  # 第二次卷积
            MaxPool2d(2),  # 第二次最大池化
            Conv2d(32, 64, 5, padding=2),  # 第三次卷积
            MaxPool2d(2),  # 第三次最大池化
            Flatten(),  # 展平层,将多维的特征图展平为一维
            Linear(1024, 64),  # 第一个全连接层
            Linear(64, 10)  # 第二个全连接层
        )

    def forward(self, x):
        x = self.model1(x)
        return x

定义损失函数和训练过程

# 定义交叉熵损失函数
loss = nn.CrossEntropyLoss()
# 初始化模型
mynn = NN()

# 训练模型
for data in dataloader:
    imgs, targets = data
    # 前向传播
    outputs = mynn(imgs)
    # 计算损失
    result_loss = loss(outputs, targets)
    # 反向传播
    result_loss.backward()
    print("--------------ok--------------")

相关推荐

  1. pytorch-10 神经网络损失函数

    2024-07-19 10:48:01       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 10:48:01       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 10:48:01       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 10:48:01       57 阅读
  4. Python语言-面向对象

    2024-07-19 10:48:01       68 阅读

热门阅读

  1. Linux下安装LightGBM CUDA版本

    2024-07-19 10:48:01       19 阅读
  2. springboot实现枚举参数

    2024-07-19 10:48:01       20 阅读
  3. C++:opencv将彩色图转换为灰度图

    2024-07-19 10:48:01       22 阅读
  4. shell处理用户输入——移动参数

    2024-07-19 10:48:01       20 阅读
  5. Github 2024-07-18 开源项目日报Top10

    2024-07-19 10:48:01       19 阅读
  6. React Router 6笔记

    2024-07-19 10:48:01       18 阅读