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=1∑n∣xi−yi∣
输入和目标张量分别是 input = [1, 1, 3]
和 target = [1, 1, 5]
。计算步骤如下:
- 计算每个元素的绝对差异:
∣ 1 − 1 ∣ = 0 , ∣ 1 − 1 ∣ = 0 , ∣ 3 − 5 ∣ = 2 |1 - 1| = 0, |1 - 1| = 0, |3 - 5| = 2 ∣1−1∣=0,∣1−1∣=0,∣3−5∣=2 - 计算平均绝对差异:
L1 Loss = 2 3 ≈ 0.6667 \text{L1 Loss} = \frac{2}{3} \approx 0.6667 L1 Loss=32≈0.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=1∑n(xi−yi)2
目标张量分别是 input = [1, 1, 3]
和 target = [1, 1, 5]
。计算步骤如下:
- 计算每个元素的平方差异:
( 1 − 1 ) 2 = 0 ( 1 − 1 ) 2 = 0 ( 3 − 5 ) 2 = 4 (1 - 1)^2 = 0 (1 - 1)^2 = 0 (3 - 5)^2 = 4 (1−1)2=0(1−1)2=0(3−5)2=4 - 计算平均平方差异:
MSE Loss = 4 3 ≈ 1.3333 \text{MSE Loss} = \frac{4}{3} \approx 1.3333 MSE Loss=34≈1.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--------------")