一、什麼是Adam優化器
Adam(Adaptive Moment Estimation)是一種常用的基於梯度下降的優化演算法,它結合了Adagrad和RMSprop演算法,能夠快速自適應地調整學習率。它不僅適用於大規模數據和高維參數的深度學習模型,而且具有很好的魯棒性和泛化能力。
二、Adam優化器參數設置
在使用Adam優化器時,需要設置一些參數,包括學習率、β1和β2、ϵ等。下面我們來詳細討論如何設置這些參數。
1. 學習率
學習率α決定了每次梯度更新的步長,它是Adam優化器中最重要的超參數之一。通常,初始的學習率可以設置為0.001或0.0001,並使用學習率衰減技術來減小學習率。
# 設置Adam優化器
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 設置學習率衰減
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, patience=2, threshold=0.001)
2. β1和β2
β1和β2分別表示梯度的一階矩估計和二階矩估計的指數衰減率。根據Adam演算法的原理,β1通常取0.9,β2通常取0.999。
3. ϵ
ϵ是一個很小的常數,用來避免分母為0的情況,在Adam演算法中通常取1e-8。
三、優化器設置最佳實踐
在使用Adam優化器時,有一些最佳實踐可以幫助我們更好地調整參數和提高模型性能。
1. 學習率調整
學習率的初始值對模型的性能影響極大,過小的學習率會導致收斂過慢,過大的學習率會導致振蕩不收斂。因此,在使用Adam優化器時,我們通常使用學習率衰減技術來自適應地調整學習率,以保證模型的收斂速度和穩定性。
2. 參數初始化
良好的參數初始化可提高模型的性能和收斂速度。通常,我們使用一些傳統的初始化方法,如均勻分布初始化、高斯分布初始化和xavier初始化等,也可以使用預訓練模型的參數作為初始值。
3. 正則化
正則化技術可以有效解決過擬合問題,常用的正則化方法包括L1正則化、L2正則化和Dropout等。在使用Adam優化器時,我們可以通過在損失函數中添加正則化項來控制模型的複雜度。
4. 批次大小調整
批次大小是指在每次參數更新時,使用的樣本數。適當的批次大小能夠提高模型的訓練速度和準確率。通常,我們可以在訓練初期使用較大的批次大小,以加快模型的收斂速度,然後逐漸降低批次大小,以提高模型的精度。
五、完整代碼示例
import torch
import torch.nn as nn
import torch.optim as optim
from torch.optim.lr_scheduler import ReduceLROnPlateau
# 定義模型
class MyNet(nn.Module):
def __init__(self):
super(MyNet, self).__init__()
self.conv1 = nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1)
self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)
self.fc1 = nn.Linear(32*8*8, 128)
self.fc2 = nn.Linear(128, 10)
self.relu = nn.ReLU()
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
self.softmax = nn.Softmax(dim=1)
def forward(self, x):
x = self.conv1(x)
x = self.relu(x)
x = self.pool(x)
x = self.conv2(x)
x = self.relu(x)
x = self.pool(x)
x = x.view(-1, 32*8*8)
x = self.fc1(x)
x = self.relu(x)
x = self.fc2(x)
x = self.softmax(x)
return x
# 數據載入
train_loader = torch.utils.data.DataLoader(train_data, batch_size=128, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_data, batch_size=128, shuffle=True)
# 設置Adam優化器
model = MyNet()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 設置學習率衰減
scheduler = ReduceLROnPlateau(optimizer, patience=2, threshold=0.001)
# 訓練模型
for epoch in range(10):
model.train()
for i, (inputs, labels) in enumerate(train_loader):
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
scheduler.step(loss)
model.eval()
with torch.no_grad():
total = 0
correct = 0
for j, (inputs, labels) in enumerate(test_loader):
outputs = model(inputs)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
acc = 100 * correct / total
print('Epoch [{}/{}], Loss: {:.4f}, Test Accuracy: {:.2f}%'.format(epoch+1, 10, loss.item(), acc))
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/307523.html