今天学习优化器。
import torch
import torchvision
from torch import nn, optim
from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear
from torch.optim.lr_scheduler import StepLR
from torch.utils.data import DataLoader
# 加载CIFAR10数据集
dataset = torchvision.datasets.CIFAR10("../data", train=False, transform=torchvision.transforms.ToTensor(), download=True)
# 创建数据加载器
dataloader = DataLoader(dataset, batch_size=1)
class Yang(nn.Module):
def __init__(self):
super(Yang, self).__init__()
# 定义神经网络模型
self.model1 = Sequential(
Conv2d(3, 32, 5, padding=2), # 输入通道数为3,输出通道数为32,卷积核大小为5x5,padding为2
MaxPool2d(2), # 最大池化操作,池化窗口大小为2x2
Conv2d(32, 32, 5, padding=2), # 输入通道数为32,输出通道数为32,卷积核大小为5x5,padding为2
MaxPool2d(2), # 最大池化操作,池化窗口大小为2x2
Conv2d(32, 64, 5, padding=2), # 输入通道数为32,输出通道数为64,卷积核大小为5x5,padding为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()
# 创建优化器
optim = optim.SGD(yang.parameters(), lr=0.01)
# 创建学习率衰减器,每隔5个epoch学习率衰减为原来的0.1
scheduler = StepLR(optim, step_size=5, gamma=0.1)
# 训练网络
for epoch in range(20):
running_loss = 0.0
for data in dataloader:
imgs, targets = data
outputs = yang(imgs)
result_loss = loss(outputs, targets)
optim.zero_grad()
result_loss.backward()
optim.step()
running_loss = running_loss + result_loss
print(running_loss)
该代码是一个简单的训练神经网络模型的示例。主要流程如下:
1. 导入相关的库,包括torch、torchvision等。
2. 加载CIFAR10数据集,并创建数据加载器。
3. 定义一个名为Yang的神经网络模型,其中包含多层卷积、池化和全连接层。模型的forward方法实现了前向传播的操作。
4. 定义损失函数,这里使用交叉熵损失函数。
5. 创建一个网络实例和优化器,这里使用SGD优化器,并设置学习率为0.01。
6. 创建学习率衰减器,每隔5个epoch学习率衰减为原来的0.1。
7. 进行训练,共进行20个epoch的训练。每个epoch中,遍历数据加载器中的每个样本,计算模型的输出和损失,并进行反向传播和参数更新。
8. 打印每个epoch的损失值。