优化器和将优化器加入CIFAR10神经网络

1.什么是优化器

        优化器的作用是在深度学习模型的训练过程中调整模型的参数(权重和偏置),以最小化损失函数(cost function),从而使模型更好地拟合训练数据。

        在训练的每一步,优化器会执行以下操作:

        计算梯度:根据当前的模型参数和训练数据,计算损失函数对每个参数的梯度。
        更新参数:根据梯度和学习率,使用优化算法的规则更新模型的参数。
        重复:多次重复这个过程,直到模型的损失达到最低或训练达到了预定的迭代次数。

2.常见优化器

        1.SGD(随机梯度下降)

        非常传统的优化器,最基本的优化算法,更新过程简单但容易陷入局部最优。

        优点:简单易用,计算开销小。
        缺点:由于只用一个样本(或小批量)计算梯度,容易陷入局部极小值,且在训练后期震荡较大。
        适用场景:适合于简单的网络结构或作为复杂优化算法的基础。

# model.parameters():将模型的所有参数传递给优化器。
# lr:learning rate,学习速率,建议小数点后面两个0
torch.optim.SGD(model.parameters() , lr)

        2.Adam

        神,Adam 结合了 RMSProp 和动量法的思想,通过自适应调整学习率,同时维护了动量的一阶和二阶矩估计。

  • 优点:适应性强,对不同类型的数据表现良好;对超参数不太敏感,默认参数通常效果不错。
  • 缺点:有可能会陷入局部最优且收敛慢,特别是在大规模数据集上。
  • 适用场景:广泛应用于各种深度学习任务,是目前最常用的优化器之一。
optimizer = torch.optim.Adam(z.parameters() , lr = 0.001)

         3.AdamW

        神中神,AdamW 是 Adam 的一种改进版本,在每次参数更新时加入了权重衰减(weight decay)来防止模型过拟合。

  • 优点:与 L2 正则化相比效果更好,能更好地防止过拟合。
  • 缺点:相较 Adam 略复杂,但总体使用体验较好。
  • 适用场景:常用于 Transformer 等需要精细调参的深度学习模型。

3.将优化器加入CIFAR10神经网络 

        1.使用SGD

        

import torch
from torch import nn
from torch.nn import L1Loss,MSELoss,Sequential,Conv2d,MaxPool2d,Linear,Flatten
import torchvision
from torch.utils.data import DataLoader
import torch.optim as optim


class Zilliax(nn.Module):
    def __init__(self):
        super(Zilliax , self).__init__()
        self.model = 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.model(x)
        return x
        
dataset = torchvision.datasets.CIFAR10('E:\\PyCharm_Project\\Pytorch_2.3.1\\PytorchVision\\dataset',train = False , transform = torchvision.transforms.ToTensor(),download = True )
dataloader = DataLoader(dataset , batch_size = 64)

loss = nn.CrossEntropyLoss()


z = Zilliax()

# 随机梯度下降
"""
torch.optim.SGD(parameters() , lr , )
lr是learning rate,设置太大,模型训练并不稳定,设置太小,模型又比较慢,一般开始大参数,后面小参数,在SGD里建议是小数点后面1个0就可以
"""
optimizer = torch.optim.SGD(z.parameters() ,lr = 0.01)

# Adam
"""
Adam 结合了 RMSProp 和动量法的思想,通过自适应调整学习率,同时维护了动量的一阶和二阶矩估计。
优点:适应性强,对不同类型的数据表现良好;对超参数不太敏感,默认参数通常效果不错。
缺点:有可能会陷入局部最优且收敛慢,特别是在大规模数据集上。
适用场景:广泛应用于各种深度学习任务,是目前最常用的优化器之一。
lr建议是小数点后2个0,lr = 0.01时,loss到epoch16就开始不稳定上升
"""
# optimizer = optim.Adam(z.parameters() , lr = 0.001) 

for epoch in range(20):
    running_loss = 0.0
    for data in dataloader:
        imgs,targets = data
        outputs = z(imgs)
        result = loss(outputs , targets)          # 交叉熵自带softmax
        optimizer.zero_grad()       # 重新设置梯度,清空上一次存入的梯度
        result.backward()
        optimizer.step()
        running_loss = running_loss + result
    print(running_loss)

 

2.Adam

import torch
from torch import nn
from torch.nn import L1Loss,MSELoss,Sequential,Conv2d,MaxPool2d,Linear,Flatten
import torchvision
from torch.utils.data import DataLoader
import torch.optim as optim


class Zilliax(nn.Module):
    def __init__(self):
        super(Zilliax , self).__init__()
        self.model = 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.model(x)
        return x
        
dataset = torchvision.datasets.CIFAR10('E:\\PyCharm_Project\\Pytorch_2.3.1\\PytorchVision\\dataset',train = False , transform = torchvision.transforms.ToTensor(),download = True )
dataloader = DataLoader(dataset , batch_size = 64)

loss = nn.CrossEntropyLoss()


z = Zilliax()

# 随机梯度下降
"""
torch.optim.SGD(parameters() , lr , )
lr是learning rate,设置太大,模型训练并不稳定,设置太小,模型又比较慢,一般开始大参数,后面小参数,在SGD里建议是小数点后面1个0就可以
"""
# optimizer = torch.optim.SGD(z.parameters() ,lr = 0.01)

# Adam
"""
Adam 结合了 RMSProp 和动量法的思想,通过自适应调整学习率,同时维护了动量的一阶和二阶矩估计。
优点:适应性强,对不同类型的数据表现良好;对超参数不太敏感,默认参数通常效果不错。
缺点:有可能会陷入局部最优且收敛慢,特别是在大规模数据集上。
适用场景:广泛应用于各种深度学习任务,是目前最常用的优化器之一。
lr建议是小数点后2个0,lr = 0.01时,loss到epoch16就开始不稳定上升
"""
optimizer = optim.Adam(z.parameters() , lr = 0.001) 

for epoch in range(20):
    running_loss = 0.0
    for data in dataloader:
        imgs,targets = data
        outputs = z(imgs)
        result = loss(outputs , targets)          # 交叉熵自带softmax
        optimizer.zero_grad()       # 重新设置梯度,清空上一次存入的梯度
        result.backward()
        optimizer.step()
        running_loss = running_loss + result
    print(running_loss)

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,主要用于图像识别和分类任务。该网络结构中包含卷积层、池化层和全连接层。在处理图像数据时,CNN可以提取图像的特征,并通过分类器对不同类别进行预测。 针对CIFAR10数据集的分类任务,可以使用PyTorch搭建卷积神经网络。根据引用中的描述,可以利用PyTorch构建一个卷积神经网络模型,并使用该模型对CIFAR10数据集进行分类。 然而,根据引用和引用的描述,上述项目可能存在一些问题。首先,引用提到对于卷积神经网络中的卷积层Conv2d的数据说明不够透彻,这可能导致对网络结构和算法的理解不够深入。其次,引用还提到网络最后的识别精度不够高,可能需要进一步优化网络结构和训练过程。 综上所述,针对CIFAR10数据集的卷积神经网络分类任务,可以使用PyTorch搭建模型。然而,为了获得更好的性能和理解,可能需要进一步学习和改进网络结构、算法以及训练过程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [基于卷积神经网络CIFAR10分类识别](https://blog.csdn.net/Sinova_L/article/details/120342573)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [人工智能 | CIFAR10卷积神经网络实践](https://blog.csdn.net/kndjg/article/details/125036761)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值