Pytorch の核心であるオプティマイザを突破! !

Pytorch の核心であるオプティマイザを突破! !

こんにちは、Xiaozhuangです!

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

ディープラーニングにおけるオプティマイザーの選択は、モデルのトレーニング効果と速度に直接影響します。さまざまな最適化ツールがさまざまな問題に適しており、それらのパフォーマンスの違いにより、モデルの収束が速くなり、安定したり、特定のタスクのパフォーマンスが向上したりする場合があります。

したがって、適切なオプティマイザーを選択することは、ディープラーニング モデルのチューニングにおいて重要な決定であり、モデルのパフォーマンスとトレーニング効率に大きな影響を与える可能性があります。

PyTorch 自体は、ニューラル ネットワークをトレーニングするときにモデルの重みを更新するための多くのオプティマイザーを提供します。

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

まず、PyTorch でよく使用されるオプティマイザーをリストし、簡単に紹介しましょう。

(1)SGD(確率的勾配降下法)

確率的勾配降下法は、最も基本的な最適化アルゴリズムの 1 つです。これは、重みに対する損失関数の勾配を計算し、勾配の負の方向に沿って重みを更新することによって行われます。

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

(2)アダム

Adam は、AdaGrad と RMSProp のアイデアを組み合わせた、適応学習率を備えた最適化アルゴリズムです。各パラメータに対して異なる学習率を適応的に計算できます。

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

(3)アダグラード

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

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

(4)RMSProp

RMSProp は、勾配のスライディング平均を考慮して学習率を調整する適応学習率アルゴリズムでもあります。

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

(5)アダデルタ

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

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

完全なケース

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

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

 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import 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 = 5 train_losses = [] train_accuracies = [] for epoch in range(num_epochs): model.train() total_loss = 0.0 correct = 0 total = 0 for 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 / total train_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 = 0 total = 0 with 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 / total print(f"Accuracy on test set: {accuracy * 100:.2f}%")

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

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

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

<<:  Googleは「ロボット工学の3原則」をシステムに導入:ロボットが人間に危害を加えることを厳しく防止

>>:  AIを活用して衛星画像を判別、世界初「全世界の船舶足跡マップ」を公開

推薦する

アメリカでは500万の仕事が機械に置き換えられました!スーパーAIは人類に不死をもたらすのか、それとも破滅をもたらすのか?

人工知能は1956年以来40年以上の発展を遂げてきました。現在、AI の目標はコンピューターを人間の...

AI の可能性を最大限に引き出す: 企業での導入を成功させる 5 つの鍵

ビジネスとテクノロジーに関心のある人なら誰でも、AI がすでに業界や日常生活に大きな変化をもたらして...

26億のパラメータ、智源と清華が中国の大規模事前トレーニングモデルをオープンソース化

最近、北京人工知能研究院と清華大学の研究チームは共同で、中国語を中核とした大規模な事前学習済み言語モ...

...

AIと機械学習モデルをトレーニング、テスト、維持する方法

AI および機械学習モデルの作成に必要なスキルセットをより深く理解するには、機械学習ソフトウェアによ...

ChatGPTを使用してスマートコントラクトとブロックチェーンに革命を起こす方法

1. はじめに近年、人工知能(AI)の進歩により、さまざまな業界に革命が起きています。 ChatGP...

...

AI と新しい小売業が出会ったとき、両者は力を合わせて無敵になれるのでしょうか?

[51CTO.com オリジナル記事] 2018 年に最も人気のある 2 つの単語はどれでしょうか...

ネットワークにおける機械学習の実用的応用

各 Web アプリケーションには独自の機能とパフォーマンス パラメーターのセットがあり、これらは動的...

...

2021 年にグラフ機械学習にはどのような新たなブレークスルーがあるでしょうか?マギル大学のポスドク研究員が分野の動向を整理

[[443041]]今年ももうすぐ終わり、あと3日で2021年も終わりです。さまざまなAI分野でも...

アルゴリズムが消費者を「計算」するのを防ぐにはどうすればよいでしょうか?専門家:対策のためのアルゴリズムの研究は可能

デジタル経済の時代では、目に見えず、実体のないアルゴリズムが常に消費者の選択に影響を与えます。近年、...

Adobe、Adobe Experience Platform モバイル パッケージをリリース

中国、北京 — 2019 年 11 月 26 日 — Adob​​e は先日、新しいモバイル パッ...

CV退化!心理学者が顔認識を学び、世界中の表情を区別するために600万本のビデオを訓練

世界中の人々は笑ったり悲しんだりするときに同じ表情をしますか? [[402741]]人々の表情が一貫...

人工知能が普及しつつある今、将来はロボットの時代になるのでしょうか?

今は特に人工知能が普及していますが、将来はロボットの時代になることは絶対にありません。なぜなら、機械...