pytorch几种learning rate的使用方式

本文详细介绍了PyTorch中几种常用的学习率调度器,包括StepLR、MultiStepLR、ExponentialLR、LinearLR、CosineAnnealingLR、CyclicLR和ReduceOnPlateau。这些调度器用于在训练过程中动态调整学习率,以优化模型性能。例如,StepLR每隔一定步数将学习率乘以一个衰减因子;MultiStepLR允许自定义多个学习率更新的里程碑;CosineAnnealingLR则实现学习率的周期性变化。ReduceOnPlateau则根据损失值是否停滞来动态调整学习率,提供更灵活的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pytorch的学习率都在torch.optim.lr_scheduler里面

使用方式基本一致,都需要和optimizer配合使用。说一下几个常用的。

StepLR

StepLR, 顾名思义,每隔多少个step,就乘以gamma衰减一次

使用方式scheduler = StepLR(optimizer, step_size = 30, gamma = 0.1, last_epoch = -1, verbose=False)

上面这个就表示每隔30个step就使得学习率变成之前的0.1倍。last_epoch表明这个更新LR的策略结束的位置,设置-1就是一直到最后。verbose意思是是否在更新lr时打印log,默认False。由于last_epoch和verbose都是可以设置的,后续就不写出来了。

当每一个epoch运行完之后记得使用scheduler.step()

MultiStepLR

与之类似的是MultiStepLR,如果你不想以固定的step更新LR,你可以自己手动设置一堆更新的节点,必须是递增的。

scheduler = MultiStepLR(optimizer, milestones=[30, 60, 120], gamma=0.1)

以上这个方式就表明在30,60和120的时候会更新lr。

ExponentialLR

与之类似的还有ExponentialLR,也是通过gamma系数变化,只是他只能每个epoch变化。
scheduler = ExponentialLR(optimizer, gamma) 相当于简化版的StepLR。

LinearLR

如果不希望学习率按乘法系数衰减,也可以使用线性的方式,设置好起始点和终点,学习率就会在这两个点直接以线性方式变化。

scheduler = LinearLR(optimizer, start_factor = 0.5, end_factor=1.5, total_iters = 5)

通过这种方式,学习率会线性变化,一种变化total_iters次,从start_factor均匀地变换到end_factor。(0.7, 0.9, 1.1, 1.3, 1.5)

CosineAnnealingLR

单调变化的学习率或许会使模型陷入局部最优点,所以有时候希望学习率能够更复杂一点。这时可以使用scheduler = CosineAnnealingLR(optimizer, T_max = 300, eta_min = 1e-5)

T_max设定最大的iteration数,eta_min是允许的最小学习率。通过这种方式,学习率可以周期性变化。

CyclicLR

这一个可以设置的参数有点多
scheduler = cyclicLR(optimizer, base_lr = 1e-4, max_lr = 5e-4, step_size_up = 2000. step_size_down = 2000, mode = 'triangular', gamma = 0.5, scale_fn = None, scale_mode='cycle', cycle_momentum = True, base_momentum = 0.8, max_momentum = 0.9)

base_lr是初始学习率,max_lr是学习率上界,每一个cycle的学习率都应该是在这两个数的区间内。

step_size_up, 每一个cycle上升部分的iterations数,默认2000,同理step_size_down是cycle的下降区间,默认跟step_size_up是一样的大小,也就是step_size_up+step_size_down就构成一个cycle,所以无需再单独设置cycle数量。当然这两个数也可以不相等。

mode和scale_fn配套使用,如果其中一个设置了,另一个就是None,默认设置为mode=‘triangular’, scale_fn=None。mode还可以选择的有triangular2, exp_range

gamma系数,默认为1

scale_mode: 默认为cycle,也可以是‘iteration’

cycle_momentum: 默认True,如果是True,momentum就会随着学习率的反比循环。

base_momentum: 默认0.8, 他是随着学习率的反比循环。在一个cycle的顶点,momentum = ‘base_momentum’, 并且lr=‘max_lr’。

max_momentum: 默认0.9,在cycle的开始阶段,momentum = ‘max_momentum’ 并且lr = ‘base_lr’。

ReduceOnPlateau

顾名思义,当loss降到一个平原地带(plateau),也就是不再继续下降了,就更新学习率政策, 这种方式比手动设置step更加灵活。

scheduler = ReduceOnPlateau(optimizer, mode='min', factor=0.1, patience = 20, threshold = 1e-4, threshold_mode = 'rel', cooldown = 0, min_lr = 1e-6, eps = 1e-8)

mode,如果设置min,就判断loss是否停止下降,设置max就判断是否停止增长。

factor,等同于其他gamma。

patience,默认10,在这个区间内,不更新学习率。超出这个范围后,如果loss没有得到提升,就更新学习率。

threshold和threshold_mode 配套使用,threshold_mode 有’rel’, ’abs’可选,会影响threshold的计算方式。

cooldown:lr变化之后,再次进行操作的冷却时间。

min_lr: 每个param group的下限。

eps: 如果两次lr的变化小于eps,则update忽略。

### 使用 PyTorch 构建 LSTM 模型进行商品时间序列预测 #### 背景介绍 LSTM(Long Short-Term Memory)是一种特殊的 RNN 结构,能够有效捕捉长时间依赖关系,在处理时间序列数据方面表现出色。通过 PyTorch 可以轻松构建并训练 LSTM 模型用于单变量或多变量时间序列预测。 以下是使用 PyTorch 和 LSTM 进行商品时间序列预测的最佳实践与代码示例: --- #### 数据准备 为了使模型能够学习到时间序列中的模式,需要对原始数据进行预处理。通常包括以下几个步骤: 1. **归一化**:将数值范围缩放到 `[0, 1]` 或 `[-1, 1]` 的区间。 2. **滑动窗口分割**:创建输入特征和目标标签的数据集。 3. **划分训练集与测试集**:确保模型不会过拟合于训练数据。 ```python import numpy as np from sklearn.preprocessing import MinMaxScaler def prepare_data(data, seq_len): scaler = MinMaxScaler(feature_range=(0, 1)) scaled_data = scaler.fit_transform(np.array(data).reshape(-1, 1)) X, y = [], [] for i in range(len(scaled_data) - seq_len): X.append(scaled_data[i:i+seq_len]) y.append(scaled_data[i+seq_len]) return np.array(X), np.array(y), scaler ``` 上述函数实现了数据的标准化以及滑动窗口分割操作[^1]。 --- #### 定义 LSTM 模型结构 定义一个简单的 LSTM 模型类继承自 `nn.Module`,其中包含嵌套的 LSTM 层和全连接层。 ```python import torch.nn as nn class LSTMModel(nn.Module): def __init__(self, input_dim=1, hidden_dim=32, num_layers=2, output_dim=1, dropout=0.2): super(LSTMModel, self).__init__() self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers=num_layers, batch_first=True, dropout=dropout) self.fc = nn.Linear(hidden_dim, output_dim) def forward(self, x): lstm_out, _ = self.lstm(x) predictions = self.fc(lstm_out[:, -1, :]) # 获取最后一个时间步的输出 return predictions ``` 此部分展示了如何初始化 LSTM 层及其参数设置[^2]。 --- #### 训练过程 编写训练循环逻辑,优化器可以选择 Adam 并配合均方误差损失函数 MSE Loss 来衡量预测值与真实值之间的差距。 ```python import torch.optim as optim def train_model(model, X_train, y_train, epochs=100, learning_rate=0.001): criterion = nn.MSELoss() optimizer = optim.Adam(model.parameters(), lr=learning_rate) for epoch in range(epochs): model.train() inputs = torch.tensor(X_train, dtype=torch.float32) labels = torch.tensor(y_train, dtype=torch.float32) outputs = model(inputs) loss = criterion(outputs.squeeze(), labels.squeeze()) optimizer.zero_grad() loss.backward() optimizer.step() if (epoch + 1) % 10 == 0: print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}') ``` 以上代码片段描述了完整的训练流程。 --- #### 测试与评估 完成训练后,可以利用测试集验证模型性能,并反向转换预测结果以便直观比较。 ```python def evaluate_model(model, X_test, y_test, scaler): model.eval() with torch.no_grad(): test_inputs = torch.tensor(X_test, dtype=torch.float32) predicted_values = model(test_inputs).numpy().squeeze() actual_values = scaler.inverse_transform(y_test.reshape(-1, 1)).flatten() predicted_values = scaler.inverse_transform(predicted_values.reshape(-1, 1)).flatten() return actual_values, predicted_values ``` 此处提供了模型评估的具体方法。 --- #### 总结 综上所述,通过 PyTorch 实现 LSTM 时间序列预测涉及多个关键环节,包括但不限于数据预处理、网络架构设计、训练配置及最终效果评测。这些步骤共同构成了高效的时间序列分析框架。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值