今天学习损失函数与反向传播。
1、损失函数
import torch
from torch.nn import L1Loss
from torch import nn
# 创建输入和目标张量
inputs = torch.tensor([1, 2, 3], dtype=torch.float32)
targets = torch.tensor([1, 2, 5], dtype=torch.float32)
# 重新调整输入和目标张量的形状,将其转换为 4D 张量(batch_size, channels, height, width)
inputs = torch.reshape(inputs, (1, 1, 1, 3))
targets = torch.reshape(targets, (1, 1, 1, 3))
# 创建 L1 损失函数
loss = L1Loss(reduction='sum')
# 计算 L1 损失,并将结果存储在 result 变量中
result = loss(inputs, targets)
# 创建 MSE 损失函数
loss_mse = nn.MSELoss()
# 计算 MSE 损失,并将结果存储在 result_mse 变量中
result_mse = loss_mse(inputs, targets)
# 打印 L1 损失和 MSE 损失的结果
print(result)
print(result_mse)
# 创建新的输入和目标张量
x = torch.tensor([0.1, 0.2, 0.3])
y = torch.tensor([1])
# 重新调整 x 张量的形状
x = torch.reshape(x, (1, 3))
# 创建交叉熵损失函数
loss_cross = nn.CrossEntropyLoss()
# 计算交叉熵损失,并将结果存储在 result_cross 变量中
result_cross = loss_cross(x, y)
# 打印交叉熵损失的结果
print(result_cross)
该段代码主要包含以下内容:
1. 导入所需的库和模块。
2. 创建输入和目标张量,并通过reshape函数将其调整为适当的形状。
3. 创建L1Loss损失函数,并使用inputs和targets计算L1Loss损失。
4. 创建MSELoss损失函数,并使用inputs和targets计算MSELoss损失。
5. 打印L1Loss和MSELoss的结果。
6. 创建输入和目标张量,并通过reshape函数将输入张量调整为适当的形状。
7. 创建CrossEntropyLoss损失函数,并使用输入张量x和目标张量y计算CrossEntropyLoss损失。
8. 打印CrossEntropyLoss的结果。
2、反向传播
import torchvision
from torch import nn
from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear
from torch.utils.data import DataLoader
# 加载CIFAR10数据集
dataset = torchvision.datasets.CIFAR10(
"../data",
train=False,
transform=torchvision.transforms.ToTensor(),
download=True
)
# 创建数据加载器,设置batch_size为1
dataloader = DataLoader(dataset, batch_size=1)
# 定义一个名为Yang的神经网络模型
class Yang(nn.Module):
def __init__(self):
super(Yang, self).__init__()
# 构建模型的各个层
self.model1 = Sequential(
Conv2d(3, 32, 5, padding=2), # 输入通道数为3,输出通道数为32,卷积核大小为5x5,填充为2
MaxPool2d(2), # 最大池化层,池化核大小为2x2
Conv2d(32, 32, 5, padding=2), # 输入通道数为32,输出通道数为32,卷积核大小为5x5,填充为2
MaxPool2d(2), # 最大池化层,池化核大小为2x2
Conv2d(32, 64, 5, padding=2), # 输入通道数为32,输出通道数为64,卷积核大小为5x5,填充为2
MaxPool2d(2), # 最大池化层,池化核大小为2x2
Flatten(), # 将多维数据扁平化为一维
Linear(1024, 64), # 全连接层,输入节点数为1024,输出节点数为64
Linear(64, 10) # 全连接层,输入节点数为64,输出节点数为10
)
def forward(self, x):
x = self.model1(x) # 前向传播计算输出
return x
# 创建交叉熵损失函数
loss = nn.CrossEntropyLoss()
# 创建神经网络模型实例
yang = Yang()
# 循环迭代数据加载器中的数据
for data in dataloader:
imgs, targets = data # 获取数据和标签
outputs = yang(imgs) # 使用神经网络模型进行前向传播计算
result_loss = loss(outputs, targets) # 计算损失
result_loss.backward() # 反向传播计算梯度
print("ok") # 打印“ok”
该段代码主要包含以下内容:
1. 导入所需的库和模块。
2. 加载CIFAR10数据集并创建数据加载器。
3. 定义了一个名为Yang的神经网络模型,包含了卷积层、池化层、全连接层等多个层。
4. 创建交叉熵损失函数和神经网络模型实例。
5. 在循环中,遍历数据加载器中的数据,并通过神经网络模型进行前向传播计算和反向传播计算梯度。
6. 打印“ok”。