PyTorch如何训练网络时调整学习率
在PyTorch中,我们可以使用学习率调度器来动态地调整学习率。本文将介绍如何使用PyTorch中的学习率调度器来调整学习率,并提供两个示例说明。
1. 示例1:使用StepLR调整学习率
以下是一个示例,展示如何使用StepLR
调整学习率。
import torch
import torch.nn as nn
import torch.optim as optim
from torch.optim.lr_scheduler import StepLR
# 创建一个简单的神经网络模型
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(10, 5)
self.fc2 = nn.Linear(5, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
model = Net()
# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 定义学习率调度器
scheduler = StepLR(optimizer, step_size=5, gamma=0.1)
# 训练模型
for epoch in range(10):
running_loss = 0.0
for i in range(10):
# 生成随机输入和标签
inputs = torch.randn(1, 10)
labels = torch.randn(1, 1)
# 将梯度清零
optimizer.zero_grad()
# 前向传播
outputs = model(inputs)
# 计算损失
loss = criterion(outputs, labels)
# 反向传播
loss.backward()
# 更新参数
optimizer.step()
running_loss += loss.item()
# 调整学习率
scheduler.step()
print('Epoch %d, Loss: %.3f' % (epoch+1, running_loss/10))
在上面的示例中,我们首先创建了一个简单的神经网络模型,并定义了损失函数和优化器。然后,我们使用StepLR
创建了一个学习率调度器,其中step_size
表示每隔多少个epoch调整一次学习率,gamma
表示学习率的缩放因子。接下来,我们使用for
循环遍历训练数据集,并在每个批次上训练模型。在每个epoch结束时,我们使用scheduler.step()
方法调整学习率。最后,我们打印出每个epoch的Loss。
2. 示例2:使用ReduceLROnPlateau调整学习率
以下是一个示例,展示如何使用ReduceLROnPlateau
调整学习率。
import torch
import torch.nn as nn
import torch.optim as optim
from torch.optim.lr_scheduler import ReduceLROnPlateau
# 创建一个简单的神经网络模型
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(10, 5)
self.fc2 = nn.Linear(5, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
model = Net()
# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 定义学习率调度器
scheduler = ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=2)
# 训练模型
for epoch in range(10):
running_loss = 0.0
for i in range(10):
# 生成随机输入和标签
inputs = torch.randn(1, 10)
labels = torch.randn(1, 1)
# 将梯度清零
optimizer.zero_grad()
# 前向传播
outputs = model(inputs)
# 计算损失
loss = criterion(outputs, labels)
# 反向传播
loss.backward()
# 更新参数
optimizer.step()
running_loss += loss.item()
# 计算验证集Loss
val_loss = criterion(model(torch.randn(1, 10)), torch.randn(1, 1))
# 调整学习率
scheduler.step(val_loss)
print('Epoch %d, Loss: %.3f, Val Loss: %.3f' % (epoch+1, running_loss/10, val_loss))
在上面的示例中,我们首先创建了一个简单的神经网络模型,并定义了损失函数和优化器。然后,我们使用ReduceLROnPlateau
创建了一个学习率调度器,其中mode
表示监测的指标,factor
表示学习率的缩放因子,patience
表示在多少个epoch内没有改善时调整学习率。接下来,我们使用for
循环遍历训练数据集,并在每个批次上训练模型。在每个epoch结束时,我们计算验证集Loss,并使用scheduler.step()
方法调整学习率。最后,我们打印出每个epoch的Loss和验证集Loss。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Pytorch 如何训练网络时调整学习率 - Python技术站