ホームページ  >  記事  >  テクノロジー周辺機器  >  Pytorch の重要なポイントを改善し、オプティマイザーを改善します。

Pytorch の重要なポイントを改善し、オプティマイザーを改善します。

WBOY
WBOY転載
2024-01-05 13:22:011206ブラウズ

こんにちは、Xiaozhuangです!

今日は、Pytorch のオプティマイザーについて話します。

オプティマイザーの選択は、深層学習モデルのトレーニング効果と速度に直接影響します。さまざまなオプティマイザーがさまざまな問題に適しており、それらのパフォーマンスの違いにより、モデルがより速くより安定して収束したり、特定のタスクのパフォーマンスが向上したりする可能性があります。したがって、オプティマイザーを選択するときは、特定の問題の特性に基づいてトレードオフと決定を行う必要があります。

したがって、深層学習モデルを調整するには、適切なオプティマイザーを選択することが重要です。オプティマイザーの選択は、モデルのパフォーマンスだけでなく、トレーニング プロセスの効率にも大きく影響します。

PyTorch は、ニューラル ネットワークのトレーニングやモデルの重みの更新に使用できるさまざまなオプティマイザーを提供します。これらのオプティマイザーには、一般的な SGD、Adam、RMSprop などが含まれます。各オプティマイザーには、独自の特性と適用可能なシナリオがあります。適切なオプティマイザーを選択すると、モデルの収束が加速され、トレーニング結果が向上します。オプティマイザーを使用する場合は、損失関数とモデル パラメーターを定義するだけでなく、学習率や重み減衰などのハイパーパラメーターを設定する必要があります。

突破Pytorch核心点,优化器 !!

一般的なオプティマイザー

最初に、PyTorch でよく使用されるオプティマイザーをいくつかリストし、それらについて簡単に説明します。

方法を理解しましょう。 SGD (確率的勾配降下法) が機能します。 SGD は、機械学習モデルのパラメーターを解決するために使用される、一般的に使用される最適化アルゴリズムです。サンプルの小さなバッチをランダムに選択することによって勾配を推定し、勾配の負の方向を使用してパラメーターを更新します。これにより、反復プロセス中にモデルのパフォーマンスを徐々に最適化できます。 SGD の利点は、高い計算効率であり、特に

に適しています。 確率的勾配降下法は、損失関数を最小化するために一般的に使用される最適化アルゴリズムです。これは、損失関数に対する重みの勾配を計算し、勾配の負の方向に重みを更新することによって機能します。このアルゴリズムは、機械学習と深層学習で広く使用されています。

optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)

(2) Adam

Adam は、AdaGrad と RMSProp のアイデアを組み合わせた適応学習率最適化アルゴリズムです。従来の勾配降下法アルゴリズムと比較して、Adam はパラメーターごとに異なる学習率を計算して、さまざまなパラメーターの特性によりよく適応できます。学習率を適応的に調整することで、Adam はモデルの収束速度とパフォーマンスを向上させることができます。

optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

(3) Adagrad

Adagrad は、パラメータの履歴勾配に基づいて学習率を調整する適応学習率最適化アルゴリズムです。ただし、学習率が徐々に低下するため、トレーニングが途中で停止する可能性があります。

optimizer = torch.optim.Adagrad(model.parameters(), lr=learning_rate)

(4) RMSProp

RMSProp も、勾配の移動平均を考慮して学習率を調整する適応学習率アルゴリズムです。

optimizer = torch.optim.RMSprop(model.parameters(), lr=learning_rate)

(5) Adadelta

Adadelta は、適応学習率最適化アルゴリズムであり、RMSProp の改良版であり、勾配の移動平均と勾配の移動平均を考慮して学習を動的に調整します。パラメータ。レート。

optimizer = torch.optim.Adadelta(model.parameters(), lr=learning_rate)

完全なケース

ここでは、PyTorch を使用して、手書き数字認識用の単純な畳み込みニューラル ネットワーク (CNN) をトレーニングする方法について説明します。

このケースでは、MNIST データ セットを使用し、Matplotlib ライブラリを使用して損失曲線と精度曲線を描画します。

import torchimport torch.nn as nnimport torch.optim as optimfrom torchvision import datasets, transformsfrom torch.utils.data import DataLoaderimport matplotlib.pyplot as plt# 设置随机种子torch.manual_seed(42)# 定义数据转换transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])# 下载和加载MNIST数据集train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)test_loader = DataLoader(test_dataset, batch_size=1000, shuffle=False)# 定义简单的卷积神经网络模型class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)self.relu = nn.ReLU()self.pool = nn.MaxPool2d(kernel_size=2, stride=2)self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)self.fc1 = nn.Linear(64 * 7 * 7, 128)self.fc2 = nn.Linear(128, 10)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, 64 * 7 * 7)x = self.fc1(x)x = self.relu(x)x = self.fc2(x)return x# 创建模型、损失函数和优化器model = CNN()criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型num_epochs = 5train_losses = []train_accuracies = []for epoch in range(num_epochs):model.train()total_loss = 0.0correct = 0total = 0for inputs, labels in train_loader:optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()total_loss += loss.item()_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()accuracy = correct / totaltrain_losses.append(total_loss / len(train_loader))train_accuracies.append(accuracy)print(f"Epoch {epoch+1}/{num_epochs}, Loss: {train_losses[-1]:.4f}, Accuracy: {accuracy:.4f}")# 绘制损失曲线和准确率曲线plt.figure(figsize=(10, 5))plt.subplot(1, 2, 1)plt.plot(train_losses, label='Training Loss')plt.title('Training Loss')plt.xlabel('Epoch')plt.ylabel('Loss')plt.legend()plt.subplot(1, 2, 2)plt.plot(train_accuracies, label='Training Accuracy')plt.title('Training Accuracy')plt.xlabel('Epoch')plt.ylabel('Accuracy')plt.legend()plt.tight_layout()plt.show()# 在测试集上评估模型model.eval()correct = 0total = 0with torch.no_grad():for inputs, labels in test_loader:outputs = model(inputs)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()accuracy = correct / totalprint(f"Accuracy on test set: {accuracy * 100:.2f}%")

上記のコードでは、クロスエントロピー損失と Adam オプティマイザーを使用してトレーニングされた単純な畳み込みニューラル ネットワーク (CNN) を定義します。

トレーニング プロセス中に、各エポックの損失と精度を記録し、Matplotlib ライブラリを使用して損失曲線と精度曲線を描画しました。

突破Pytorch核心点,优化器 !!

私はXiao Zhuangです。また次回お会いしましょう!

以上がPytorch の重要なポイントを改善し、オプティマイザーを改善します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。