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を活用して衛星画像を判別、世界初「全世界の船舶足跡マップ」を公開

ブログ    
ブログ    
ブログ    

推薦する

一言で女の子がN着の服を着替えてくれた。Googleが動画生成を新たな高みへ。ネットユーザー「競争が激化」

Google はたった 1 つの動きで、AI ビデオ生成を新たなレベルに引き上げました。文章からビ...

顔認識アプリケーションにおける人工知能の利点と欠点についての簡単な説明

1950年代にチューリングの論文「ロボットは考えることができるか?」が人工知能への扉を開いて以来、人...

...

イノベーションに関する対話 - 51CTO 初の開発者コンテストが始まりました!

/* 世界を変えるために生きるここでは、あらゆる作品が市場に参入するための種となる可能性があります...

自動運転制御プロセスにおいて解決すべき規制上の問題は何ですか?

自動運転車は自動車の知能化の究極の目標であると広く考えられていますが、自動車技術のさまざまな段階の発...

データサイエンスにおける一般的な課題は何ですか?

2017 年後半を迎えるにあたり、データ サイエンスと機械学習を活用する企業が直面する共通の課題に...

ビジネス界がディープラーニングの導入に消極的である4つの理由

[51CTO.com クイック翻訳] 過去数年間にわたり、多くの企業がデータ主導のアプローチを採用す...

中国の大学の人工知能専攻ランキング:清華大学、浙江大学、上海交通大学がトップ3にランクイン

AIの開発が国家戦略にまで上り詰めるにつれ、人工知能は大学入試の選択肢の中でも最も注目され、最も人気...

AI はクラウド コンピューティングをどのように改善するのでしょうか?

今日、AI とクラウド コンピューティングを組み合わせることで、企業はデータを管理し、情報のパターン...

Python を使ってシンプルな遺伝的アルゴリズムをゼロから実装する

遺伝的アルゴリズムはランダムなグローバル最適化アルゴリズムです。人工ニューラル ネットワークと並んで...

Google のコード生成システムはプログラマーの半分を「飲み込んだ」のでしょうか?人類は長い間AIに「負けて」きました!

著者: 徐潔成最近、センセーショナルなAlphaGo囲碁ロボットを発売したDeepMindが再び大き...

最新レポート: 従業員の 25% が ChatGPT などの AI ツールに機密データをアップロードしている

新たな調査によると、従業員の15%がChatGPTに会社のデータを頻繁にアップロードしており、そのデ...

ロボットが仕事を独占するなら、私たちの仕事は誰が守ってくれるのでしょうか?

ロボットが人間の仕事を奪いつつあることは、何も新しいことではありません。産業技術の発展に伴い、将来的...

機械学習とデータサイエンスのための最も人気のある Python ライブラリ トップ 10

2018 年は人工知能と機械学習が急速に発展する年となるでしょう。一部の専門家は、Python は...

AIセキュリティリスクの予防と管理を強化するには、技術統合と法的規制に重点を置く必要がある

人工知能は、新たな科学技術革命と産業変革をリードする戦略的技術として、世界の主要国が科学技術の飛躍的...