文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

机器学习之Adam(Adaptive Moment Estimation)自适应学习率

2023-08-30 15:21

关注

Adam(Adaptive Moment Estimation)是一种常用的优化算法,特别适用于训练神经网络和深度学习模型。它是一种自适应学习率的优化算法,可以根据不同参数的梯度信息来动态调整学习率,以提高训练的效率和稳定性。

Adam算法的自适应性体现在以下两个方面:

  1. 动量(Momentum):Adam算法引入了动量项,类似于传统的动量优化算法。这个动量项有助于处理梯度中的高方差或低方差情况,以平滑训练过程。动量项的引入使得更新的方向不仅取决于当前梯度,还受到历史梯度的影响。

  2. 自适应学习率(Adaptive Learning Rate):Adam算法使用了每个参数的自适应学习率,这意味着不同参数可以具有不同的学习率。它使用梯度的平方的移动平均来估计每个参数的适当学习率。这允许算法对不同参数的更新速度进行调整,从而更好地适应不同参数的特性。

    Adam算法的自适应性使其在实践中通常能够表现出色,而无需手动调整学习率。然而,对于特定任务和问题,有时候可能需要调整Adam的超参数,如学习率、动量参数等,以获得最佳的性能。 Adam算法已被广泛用于深度学习领域,并被许多深度学习框架支持。

在PyTorch中使用Adam优化器非常简单,以下是一个使用Adam优化器进行深度学习模型训练的基本示例:

import torchimport torch.nn as nnimport torch.optim as optim# 假设有一个简单的神经网络模型和数据class SimpleModel(nn.Module):    def __init__(self):        super(SimpleModel, self).__init__()        self.fc = nn.Linear(2, 1)  # 一个简单的全连接层模型    def forward(self, x):        return self.fc(x)# 创建模型和数据model = SimpleModel()data = torch.tensor([[1.0, 2.0], [2.0, 3.0]], requires_grad=True)target = torch.tensor([[0.0], [1.0]])# 定义损失函数和Adam优化器criterion = nn.MSELoss()  # 均方误差损失函数optimizer = optim.Adam(model.parameters(), lr=0.01)  # 使用Adam优化器,设置学习率为0.01# 训练模型for epoch in range(100):    optimizer.zero_grad()  # 梯度清零    outputs = model(data)  # 前向传播    loss = criterion(outputs, target)  # 计算损失    loss.backward()  # 反向传播,计算梯度    optimizer.step()  # 更新模型参数    if (epoch + 1) % 10 == 0:        print(f'Epoch [{epoch+1}/100], Loss: {loss.item()}')# 模型训练完成,可以使用训练好的模型进行预测等任务

上述示例中,我们首先定义了一个简单的神经网络模型SimpleModel,然后创建了模型、数据和目标。接着,我们定义了损失函数(均方误差)和Adam优化器,然后进行了模型的训练。

在训练过程中,我们使用optimizer.zero_grad()清零梯度,进行前向传播、计算损失、反向传播计算梯度,最后使用optimizer.step()来更新模型参数。这个过程在循环中迭代多次,直到达到指定的训练轮数(这里是100轮)。

在深度学习中,通常在卷积层之后添加池化层以减小特征图的空间维度,从而降低计算复杂度并增加模型的鲁棒性。在使用ReLU激活函数的情况下,下面是一个示例,演示如何在每两层之间添加池化层。这个示例使用PyTorch:
import torchimport torch.nn as nnimport torch.optim as optimclass SimpleModel(nn.Module):    def __init__(self):        super(SimpleModel, self).__init__()        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)        self.relu1 = nn.ReLU()        self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)  # 添加池化层        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)        self.relu2 = nn.ReLU()        self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)  # 添加池化层        self.fc1 = nn.Linear(64 * 7 * 7, 128)        self.relu3 = nn.ReLU()        self.fc2 = nn.Linear(128, 10)    def forward(self, x):        x = self.pool1(self.relu1(self.conv1(x)))        x = self.pool2(self.relu2(self.conv2(x)))        x = x.view(-1, 64 * 7 * 7)  # 将特征图展平        x = self.relu3(self.fc1(x))        x = self.fc2(x)        return x# 创建模型和随机输入数据model = SimpleModel()data = torch.randn(1, 1, 28, 28)  # 输入数据,假设是28x28的单通道图像# 定义损失函数和Adam优化器criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=0.001)for epoch in range(100):    optimizer.zero_grad()  # 梯度清零    outputs = model(data)  # 前向传播    loss = criterion(outputs, target)  # 计算损失    loss.backward()  # 反向传播,计算梯度    optimizer.step()  # 更新模型参数    if (epoch + 1) % 10 == 0:        print(f'Epoch [{epoch+1}/100], Loss: {loss.item()}')# 模型训练完成,可以使用训练好的模型进行预测等任务

在上述示例中,我们在两个卷积层之后分别添加了最大池化层 (nn.MaxPool2d),这样就在每两层之间进行了一次池化。请注意,池化层的参数可以根据您的具体任务和模型架构进行调整。此外,示例中使用了ReLU激活函数 (nn.ReLU) 在卷积层之后,可以根据需要选择其他激活函数。

来源地址:https://blog.csdn.net/qq_42244167/article/details/132476913

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-人工智能
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯