機械学習 | PyTorch 簡潔チュートリアル パート 1

機械学習 | PyTorch 簡潔チュートリアル パート 1

前回の記事では、特徴の正規化とテンソルを紹介しました。次は、主にシンプルな PyTorch の実践を紹介する 2 つの簡潔な PyTorch チュートリアルを書き始めます。

1. 四則演算

import torch a = torch.tensor([2, 3, 4]) b = torch.tensor([3, 4, 5]) print("a + b: ", (a + b).numpy()) print("a - b: ", (a - b).numpy()) print("a * b: ", (a * b).numpy()) print("a / b: ", (a / b).numpy())

加算、減算、乗算、除算を説明する必要はありません。出力は次のようになります。

 a + b: [5 7 9] a - b: [-1 -1 -1] a * b: [ 6 12 20] a / b: [0.6666667 0.75 0.8 ]

2. 線形回帰

線形回帰は、図に示すように、既知の点にできるだけ近い直線を見つけることです。

図1

 import torch from torch import optim def build_model1(): return torch.nn.Sequential( torch.nn.Linear(1, 1, bias=False) ) def build_model2(): model = torch.nn.Sequential() model.add_module("linear", torch.nn.Linear(1, 1, bias=False)) return model def train(model, loss, optimizer, x, y): model.train() optimizer.zero_grad() fx = model.forward(x.view(len(x), 1)).squeeze() output = loss.forward(fx, y) output.backward() optimizer.step() return output.item() def main(): torch.manual_seed(42) X = torch.linspace(-1, 1, 101, requires_grad=False) Y = 2 * X + torch.randn(X.size()) * 0.33 print("X: ", X.numpy(), ", Y: ", Y.numpy()) model = build_model1() loss = torch.nn.MSELoss(reductinotallow='mean') optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9) batch_size = 10 for i in range(100): cost = 0. num_batches = len(X) // batch_size for k in range(num_batches): start, end = k * batch_size, (k + 1) * batch_size cost += train(model, loss, optimizer, X[start:end], Y[start:end]) print("Epoch = %d, cost = %s" % (i + 1, cost / num_batches)) w = next(model.parameters()).data print("w = %.2f" % w.numpy()) if __name__ == "__main__": main()

(1) メイン関数から始めましょう。torch.manual_seed(42)は、乱数ジェネレータのシードを設定するために使用され、生成される乱数シーケンスが実行されるたびに同じになるようにします。この関数は、シードとして整数パラメータを受け入れ、ニューラルネットワークのトレーニングなど、乱数を必要とするシナリオで使用して、結果の再現性を確保できます。

(2)torch.linspace(-1, 1, 101, requires_grad=False)は、指定された間隔内で等間隔の値のセットを生成するために使用されます。この関数は、開始値、終了値、要素数の3つのパラメータを受け取り、指定された数の等間隔の値を含むテンソルを返します。

(3)build_model1の内部実装:

  • torch.nn.Sequential(torch.nn.Linear(1, 1,bias=False)) は、nn.Sequential クラスのコンストラクターを使用し、線形レイヤーをパラメーターとして渡して、線形レイヤーを含むニューラル ネットワーク モデルを返します。
  • build_model2 と build_model1 の機能は同じで、add_module() メソッドを使用して linear という名前のサブモジュールが追加されます。

(4)torch.nn.MSELoss(reductinotallow='mean')は損失関数を定義します。

(5)optim.SGD(model.parameters(), lr=0.01, momentum=0.9)は確率的勾配降下法(SGD)最適化アルゴリズムを実装する。

(6)トレーニングセットをbatch_sizeで分割し、100回繰り返す。

(7) 次はニューラルネットワークモデルのトレーニングに使用されるトレーニング関数trainです。具体的には、この関数は以下のパラメータを受け入れます。

  • model: ニューラル ネットワーク モデル。通常は nn.Module から継承するクラスのインスタンスです。
  • loss: モデルの予測値と実際の値の差を計算するために使用される損失関数。
  • オプティマイザー: モデルのパラメータを更新するために使用されるオプティマイザー。
  • x: 入力データ、torch.Tensor 型のテンソル。
  • y: ターゲット データ、torch.Tensor 型のテンソル。

(8)trainはPyTorchのトレーニング手順の一般的な方法です。手順は次のとおりです。

  • モデルをトレーニング モードに設定します。これにより、ドロップアウトやバッチ正規化など、トレーニング中に使用される特別な操作が有効になります。
  • 新たな勾配計算を実行できるように、オプティマイザーの勾配キャッシュをクリアします。
  • 入力データをモデルに渡し、モデルの予測値を計算し、予測値とターゲットデータを損失関数に渡して損失値を計算します。
  • 損失値を逆伝播し、モデルパラメータの勾配を計算します。
  • オプティマイザーを使用してモデル パラメータを更新し、損失値を最小化します。
  • 損失値のスカラー値を返します。

(9) print("Epoch = %d, cost = %s" % (i + 1, cost / num_batches)) 最後に、現在のトレーニングラウンドと損失値を出力します。上記のコードの出力は次のとおりです。

 ... Epoch = 95, cost = 0.10514946877956391 Epoch = 96, cost = 0.10514946877956391 Epoch = 97, cost = 0.10514946877956391 Epoch = 98, cost = 0.10514946877956391 Epoch = 99, cost = 0.10514946877956391 Epoch = 100, cost = 0.10514946877956391 w = 1.98

3. ロジスティック回帰

ロジスティック回帰では、図に示すように、曲線を使用して一連の離散点の軌跡を近似します。

図2

 import numpy as np import torch from torch import optim from data_util import load_mnist def build_model(input_dim, output_dim): return torch.nn.Sequential( torch.nn.Linear( input_dim, output_dim, bias=False) ) def train(model, loss, optimizer, x_val, y_val): model.train() optimizer.zero_grad() fx = model.forward(x_val) output = loss.forward(fx, y_val) output.backward() optimizer.step() return output.item() def predict(model, x_val): model.eval() output = model.forward(x_val) return output.data.numpy().argmax(axis=1) def main(): torch.manual_seed(42) trX, teX, trY, teY = load_mnist(notallow=False) trX = torch.from_numpy(trX).float() teX = torch.from_numpy(teX).float() trY = torch.tensor(trY) n_examples, n_features = trX.size() n_classes = 10 model = build_model(n_features, n_classes) loss = torch.nn.CrossEntropyLoss(reductinotallow='mean') optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9) batch_size = 100 for i in range(100): cost = 0. num_batches = n_examples // batch_size for k in range(num_batches): start, end = k * batch_size, (k + 1) * batch_size cost += train(model, loss, optimizer, trX[start:end], trY[start:end]) predY = predict(model, teX) print("Epoch %d, cost = %f, acc = %.2f%%" % (i + 1, cost / num_batches, 100. * np.mean(predY == teY))) if __name__ == "__main__": main()

(1) main関数から始めます。torch.manual_seed(42)には上記で紹介されているので、ここでは省略します。

(2)load_mnistは自分でmnistデータセットをダウンロードし、trXとteXを入力データとして返し、trYとteYをラベルデータとして返す。

(3) build_modelの内部実装: torch.nn.Sequential(torch.nn.Linear(input_dim, output_dim,bias=False))は線形層を持つニューラルネットワークモデルを構築するために使用されます。モデルの入力特徴の数はinput_dim、出力特徴の数はoutput_dimであり、線形層にはバイアス項はありません。n_classes=10は10のカテゴリが出力されることを意味します。

(4)その他の手順は、損失関数、勾配降下法オプティマイザーを定義し、トレーニングセットをbatch_sizeで分割し、100回トレーニングすることです。

(5)optim.SGD(model.parameters(), lr=0.01, momentum=0.9)は確率的勾配降下法(SGD)最適化アルゴリズムを実装する。

(6)各トレーニングラウンドが完了したら、predictを実行します。predictは、model(トレーニング済みモデル)とteX(予測対象データ)の2つのパラメータを受け入れます。手順は次のとおりです。

  • model.eval() はモデルを評価モードに設定します。つまり、モデルはトレーニングされず、推論にのみ使用されます。
  • 出力を NumPy 配列に変換し、argmax() メソッドを使用して各サンプルの予測カテゴリを取得します。

(7) print("Epoch %d, cost = %f, acc = %.2f%%" % (i + 1, cost / num_batches, 100. * np.mean(predY == teY))) 最後に、現在のトレーニング ラウンド、損失値、acc を出力します。上記のコードは次のように出力します (実行は非常に高速ですが、精度は低くなります)。

 ... Epoch 91, cost = 0.252863, acc = 92.52% Epoch 92, cost = 0.252717, acc = 92.51% Epoch 93, cost = 0.252573, acc = 92.50% Epoch 94, cost = 0.252431, acc = 92.50% Epoch 95, cost = 0.252291, acc = 92.52% Epoch 96, cost = 0.252153, acc = 92.52% Epoch 97, cost = 0.252016, acc = 92.51% Epoch 98, cost = 0.251882, acc = 92.51% Epoch 99, cost = 0.251749, acc = 92.51% Epoch 100, cost = 0.251617, acc = 92.51%

4. ニューラルネットワーク

図に示すような、文字分類用の古典的な LeNet ネットワーク:

図3

  • 多層ニューラルネットワークを定義する
  • データセットの前処理とネットワークへの入力としての準備
  • ネットワークへのデータ入力
  • ネットワークの損失を計算する
  • バックプロパゲーション、勾配の計算
import numpy as np import torch from torch import optim from data_util import load_mnist def build_model(input_dim, output_dim): return torch.nn.Sequential( torch.nn.Linear(input_dim, 512, bias=False), torch.nn.Sigmoid(), torch.nn.Linear(512, output_dim, bias=False) ) def train(model, loss, optimizer, x_val, y_val): model.train() optimizer.zero_grad() fx = model.forward(x_val) output = loss.forward(fx, y_val) output.backward() optimizer.step() return output.item() def predict(model, x_val): model.eval() output = model.forward(x_val) return output.data.numpy().argmax(axis=1) def main(): torch.manual_seed(42) trX, teX, trY, teY = load_mnist(notallow=False) trX = torch.from_numpy(trX).float() teX = torch.from_numpy(teX).float() trY = torch.tensor(trY) n_examples, n_features = trX.size() n_classes = 10 model = build_model(n_features, n_classes) loss = torch.nn.CrossEntropyLoss(reductinotallow='mean') optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9) batch_size = 100 for i in range(100): cost = 0. num_batches = n_examples // batch_size for k in range(num_batches): start, end = k * batch_size, (k + 1) * batch_size cost += train(model, loss, optimizer, trX[start:end], trY[start:end]) predY = predict(model, teX) print("Epoch %d, cost = %f, acc = %.2f%%" % (i + 1, cost / num_batches, 100. * np.mean(predY == teY))) if __name__ == "__main__": main()

(1) 上記のニューラルネットワークコードは、ロジスティック回帰コードとあまり変わりません。違いはbuild_modelです。ここでは、2つの線形層とシグモイド活性化関数を持つニューラルネットワークモデルが構築されます。モデルには、入力特徴の数をinput_dim、出力特徴の数をoutput_dimとする線形層、シグモイド活性化関数、および入力特徴の数を512、出力特徴の数をoutput_dimとする線形層が含まれています。

(2) print("Epoch %d, cost = %f, acc = %.2f%%" % (i + 1, cost / num_batches, 100. * np.mean(predY == teY))) 最後に、現在のトレーニングラウンド、損失値、accを出力します。 上記のコードは次のように入力します(実行時間はロジスティック回帰よりも長くなりますが、精度ははるかに高くなります)。

 ... Epoch 91, cost = 0.054484, acc = 97.58% Epoch 92, cost = 0.053753, acc = 97.56% Epoch 93, cost = 0.053036, acc = 97.60% Epoch 94, cost = 0.052332, acc = 97.61% Epoch 95, cost = 0.051641, acc = 97.63% Epoch 96, cost = 0.050964, acc = 97.66% Epoch 97, cost = 0.050298, acc = 97.66% Epoch 98, cost = 0.049645, acc = 97.67% Epoch 99, cost = 0.049003, acc = 97.67% Epoch 100, cost = 0.048373, acc = 97.68%


<<:  機械学習 | PyTorch 簡潔チュートリアル パート 2

>>: 

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

人間の仕事が危機に瀕しているか?この時代にいかに目立つかが非常に重要です

序文「データ奴隷」現象は、AI時代の新たなエリート層を生み出したが、同時に、すでに強大な企業をさらに...

ディープラーニングを使用してフロントエンドデザインモデルをコードに自動的に変換する方法は?

[[223504]]現在、フロントエンド開発の自動化に対する最大の障壁はコンピューティング能力です...

現在、中国における知能ロボットの開発状況はどうなっているのでしょうか?

インテリジェントロボットは、知覚、思考、効果の面で人間を完全にシミュレートする機械システムです。近年...

ジェネレーティブAIがインテリジェントオートメーションを推進する方法

1997 年、世界は現チェスチャンピオンのガルリ・カスパロフと IBM の Deep Blue AI...

Uber Ludwig は、ローコード機械学習用のオープンソース フレームワークです。

[[330500]] 【51CTO.com クイック翻訳】ディープラーニング モデルのトレーニング...

人工知能は広告に関して私たちを誤解させている。今こそ誤りを正すべき時だ

社会が急速に変化する時代において、ブランドセーフティ戦略は分裂を招き、保護対象であるブランド評判その...

この記事では、ロボットが視覚を通じてターゲット追跡を実現する方法を説明します。

概要: 視覚追跡技術は、コンピュータービジョン(人工知能の一分野)の分野における重要なトピックであり...

...

テンセントのロボットファミリーに新しいメンバーが加わりました。「新年の挨拶をして紅包をお願いする」ことができるロボット犬を見たことがありますか?

テンセントは3月2日、自社で完全に開発したソフトウェアとハ​​ードウェアを搭載した初のマルチモーダル...

外国メディアが報じたところによると、EUはデータプライバシーを弱めるため、エンドツーエンドの暗号化にバックドアを検討している。

インド、米国、英国、オーストラリアに続き、エンドツーエンドの暗号化は欧州連合から厳しい監視を受けてい...

デジタルイノベーション:次の世界的危機に対応するための重要な要素

世界的なCOVID-19危機は依然として猛威を振るっていますが、一部の組織はすでに将来のパンデミック...

人工知能の6つの主要概念とAIプロジェクトを実装するための7つの考慮事項を1つの記事で理解する

AI はすべての問題を解決できるわけではありませんが、正しく適用すれば短期間で大きな変化をもたらすこ...

機械学習は、足を上げることから敷居に落ちることまで行います

突然、AI 時代に入ったようです。裏では、多くの友人が、来たる All in AI を迎えるために、...

...

ソラを批判した後、ルカン氏は「視覚世界モデル」と題した論文を発表し、AIが物理世界を学習するための鍵を明らかにした。

ソラの登場はAI界全体に熱狂を巻き起こしたが、ルカンは例外だった。 OpenAI による Sora ...