機械学習 | 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

>>: 

ブログ    

推薦する

何も知らない状態から、3分で「ナレッジグラフ」を素早く理解するまで

[51CTO.com からのオリジナル記事] ナレッジ グラフは、インテリジェント マシンの脳を解き...

...

...

自動運転はどこまで徹底できるのか?運転席をなくすことさえできる。

Baiduの無人運転アプリケーションを見ました。私は車の所有者が自動で駐車するのを助けるアウディの...

「AIGC+」|新たなマーケティングパラダイム:AIGCは海外進出企業にとって「新たな武器」となり得るか?

わずか 1 年で、AIGC がもたらした業界を変革するアプリケーションは、徐々に人々の生活の隅々に浸...

2020年のIoTイベントトップ10を振り返る。アプリケーションの加速

今日では、それはもはや高尚な概念ではありません。スマートカーやスマートホームから、企業の資産管理機器...

...

距離ベクトルルーティングアルゴリズムの仕組みを説明する

[[122231]]現代のコンピュータ ネットワークでは、ネットワーク トポロジやトラフィックの変化...

...

人工知能がITサービス管理を変える3つの方法

よりスマートで高速なサービスを求めて、IT 部門は社内のサービス提供を改善するための新しい方法とプロ...

アプリオリアルゴリズム原理の要約

[[182123]]関連付けアルゴリズムは、データ マイニングにおける重要なタイプのアルゴリズムです...

2020年末レビュー: AIの失敗トップ10

これは、Synced の年末総集編「AI の失敗」の第 4 弾です。私たちの目標は、AI 研究を非難...

MITとIBMが共同で「コンピュータービジョンの黄金時代に備える」ための新しいデータセットを発表

人工知能の分野における画像分類問題に関して言えば、トレーニングとテストに最もよく使用されるデータセッ...

...