一、简介:优化器在神经网络模型中的作用是通过调节模型参数来优化模型性能,使其能够更好的拟合训练数据,提高预测准确性。同时,优化器还具有快速收敛、防止过拟合和避免陷入局部最优等能力,以确保模型的有效性和准确性
二、参数:
1、params参数:模型的参数,传递给优化器可调节参数的信息
2、 lr参数:学习速率,一般来说学习速率不能设置的太大或太小,太大模型不稳定,太小模型训练太慢,刚开始训练时推荐学习速率较大,训练到后期再使用小速率
三、代码应用(代码中的注释更详细):
(此次采用的神经网络模型还是先前文章中介绍的实战的一种网络模型)
import torch.optim
from torch import nn
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from torch.utils.data import DataLoader
import torchvision
tensor_trans = transforms.ToTensor()
test_data = torchvision.datasets.CIFAR10(root="./dataloader",train=False,transform=tensor_trans,download=True)
dataloader = DataLoader(dataset=test_data,batch_size=64,shuffle=True,num_workers=0,drop_last=False)
# 在神经网络模型中padding需要自己进行根据公式进行计算
class Module(nn.Module):
def __init__(self):
super().__init__()
# 第一次卷积,输出的通道数为下一个图像的输入通道数,padding根据公式自己计算
self.conv1 = nn.Conv2d(in_channels=3,out_channels=32,kernel_size=5,padding=2)
self.maxpool1 = nn.MaxPool2d(kernel_size=2)
self.conv2 = nn.Conv2d(in_channels=32,out_channels=32,kernel_size=5,padding=2)
self.maxpool2 = nn.MaxPool2d(2)
self.conv3 = nn.Conv2d(in_channels=32,out_channels=64,kernel_size=5,padding=2)
self.maxpool3 = nn.MaxPool2d(kernel_size=2)
self.flatten = nn.Flatten()
# 1024计算:图中给出64@4*4,即共64*4*4个输出
self.linear1 = nn.Linear(1024,64)
self.linear2 = nn.Linear(64,10)
def forward(self,imgs):
imgs = self.conv1(imgs)
imgs = self.maxpool1(imgs)
imgs = self.conv2(imgs)
imgs = self.maxpool2(imgs)
imgs = self.conv3(imgs)
imgs = self.maxpool3(imgs)
imgs = self.flatten(imgs)
imgs = self.linear1(imgs)
imgs = self.linear2(imgs)
return imgs
# 检测结果是否正确
# module = Module()
# input = torch.ones([64,3,32,32]) # 利用ones函数设置一个全为1的张量,指定形状为(64,3,32,32),用于测试数据是否正确
# output = module(input)
# print(output.shape)
# 建立一个loss
loss = nn.CrossEntropyLoss()
module = Module()
# 设置优化器,采用随机梯度下降的优化器
optima1 = torch.optim.SGD(params=module.parameters(),lr=0.01)
# params参数:模型的参数,传递给优化器可调节参数的信息
# lr参数:学习速率,一般来说学习速率不能设置的太大或太小,太大模型不稳定,太小模型训练太慢,刚开始训练时推荐学习速率较大,训练到后期再使用小速率
# 迭代20轮
for each in range(20):
# 设置一个参数,用于查看每一轮损失值的总和
running_loss = 0.0
for data in dataloader:
imgs,targets = data
# 将训练结果存储到神经网络当中
output = module(imgs)
# result_loss得到的是神经网络输出和真实输出之间的一个误差
result_loss = loss(output,targets)
# 优化器使用第一步:将每一个网络模型中每一个可以调节的参数对应的的梯度调为0
optima1.zero_grad() # 此时的参数对应的梯度全部设置为0
# 优化器需要每个参数的梯度
result_loss.backward() # 得到每个可调节参数对应的梯度
optima1.step() # 调用此方法对每个参数进行调优
# 将每个神经网络的损失相加
running_loss += result_loss
# 查看每一轮
print(running_loss)