PyTorchチュートリアル

⚡ スマートサマリー

PyTorchはMeta社が開発したオープンソースの深層学習フレームワークであり、2026年にはAI研究論文の85%を支えることになると予測されている。 Less講義では、インストール、フレームワークの基本、簡単な回帰テスト、画像分類、およびAWS SageMakerのデプロイについて説明します。

  • 🧠 動的グラフ: イージー実行とは、テンソルが行ごとに実行され、 Python-スタイルのデバッグ。
  • 🐍 Pythonic API: NumPy に精通している人なら誰でも自然に読めます。 Python.
  • 📦 豊かなエコシステム: ハギングフェイス、vLLM、ディープスピード、そして TorchVisionはPyをベースに構築されていますTorCH。
  • ⚙️ トレーニングワークフロー: モデルを定義し、損失関数とオプティマイザを選択し、順方向、逆方向、ステップ実行を繰り返します。
  • 📊 研究の優位性: 最近の論文の85パーセントはPyを使用しているTorch 対 15 パーセント TensorFlow。
  • 🤖 LLM(法学修士)取得準備完了: トランスフォーマー、LoRAファインチューニング、および量子化ワークフローをネイティブにサポートします。

PyTorchチュートリアル

パイとは何ですかTorえ?

PyTorch オープンソースです Torch ベースの自然言語処理用機械学習ライブラリ PythonNumPyに似ていますが、強力なGPUサポートを備えています。autograd.pyの助けを借りて、実行中に変更できる動的な計算グラフを提供します。Torchは他のフレームワークよりも高速です。2016年にFacebookのAI研究グループによって開発されました。

Pyが何であるかを知るTorchは、その長所と短所についてバランスの取れた見方を提示します。

PyTorch メリットとデメリット

Py の利点と欠点は以下のとおりです。TorCH:

Pyの利点Torch

  1. 簡易ライブラリ
    PyTorchコードはシンプルです。理解しやすく、すぐにライブラリを使用できます。例えば、以下のコードスニペットをご覧ください。
class Net(torch.nn.Module):
   def __init__(self):
       super(Net, self).__init__()
       self.layer = torch.nn.Linear(1, 1)

   def forward(self, x):
       x = self.layer(x)      
       return x

前述したように、ネットワーク モデルは簡単に定義でき、あまりトレーニングしなくてもコードをすぐに理解できます。

  1. 動的計算グラフ

動的計算グラフ

画像出典:Exploring Deep Learning with PyTorch

PyTorchは動的計算グラフ(DAG)を提供します。計算グラフとは、ノードとエッジなどのグラフモデルや理論を用いて数式を表現する方法です。ノードは数学演算を実行し、エッジはノードに入力されるテンソルであり、ノードの出力をテンソルとして伝達します。

DAG は、任意の形状を保持し、異なる入力グラフ間で操作を実行できるグラフです。反復ごとに新しいグラフが作成されます。したがって、同じグラフ構造を持つことも、異なる操作で新しいグラフを作成することもできます。これを動的グラフと呼ぶこともできます。

  1. 性能向上

コミュニティと研究者は、フレームワークのベンチマークと比較を行い、どちらが速いかを確認します。 GitHub リポジトリ 深層学習フレームワークと GPU のベンチマーク Py が報告したTorchは、1秒あたりに処理される画像数という点で、他のフレームワークよりも高速です。

以下に示すように、vgg16 と resnet152 の比較グラフは次のとおりです。

Pyの利点Torch

Pyの利点Torch

  1. ネイティブ Python

PyTorch は Python ベースです。たとえば、モデルをトレーニングしたい場合は、loo などのネイティブ制御フローを使用できます。ping また、特別な変数やセッションを追加することなく再帰処理を実行できます。これはトレーニングプロセスにおいて非常に役立ちます。

PyTorchは命令型プログラミングも実装しており、間違いなく柔軟性が高い。そのため、計算処理の途中でテンソル値を出力することも可能だ。

Pyの欠点Torch

PyTorchは可視化のためにサードパーティ製アプリケーションを必要とします。また、本番環境ではAPIサーバーも必要です。

次にこの Py ではTorchチュートリアルでは、Pyの違いについて学びますTorchとTensorFlow。

PyTorch 対 TensorFlow

PyTorch TensorFlow
モデル定義 モデルはサブクラスで定義され、使いやすいパッケージを提供します モデルは多くの要素で定義されており、構文を理解する必要があります
GPUのサポート あり あり
グラフタイプ ダイナミック 静的
ツール 視覚化ツールがない Tensorboard視覚化ツールを使用できます
コミュニティ コミュニティは成長し続けています 大規模なアクティブなコミュニティ

比較を念頭に置いて、次のステップは Py を入手することですTorch はローカルまたはクラウドで実行されます。

PyをインストールしていますTorch

Linux

Linux にインストールするのは簡単です。 仮想環境を使用するか、root アクセスで直接インストールするかを選択できます。 ターミナルにこのコマンドを入力します

pip3 install --upgrade torch torchvision

AWS セージメーカー

Sagemaker は、 Amazon ウェブサービス これは、データ サイエンティストや開発者があらゆる規模でモデルを構築、トレーニング、デプロイできるように、プリインストールされた深層学習構成を備えた強力な機械学習エンジンを提供します。

最初に開きます Amazon セージメーカー コンソールで「ノートブックインスタンスの作成」をクリックし、ノートブックの詳細をすべて入力します。

AWS セージメーカー

次のステップでは、「開く」をクリックしてノートブック インスタンスを起動します。

AWS セージメーカー

最後に、 Jupyter「新規」をクリックして「conda_pytorch_p36」を選択すれば、PyTorchでノートブックインスタンスを使用する準備が整います。Torchがインストールされました。

次にこの Py ではTorchチュートリアルでは、Pyについて学びます。Torchフレームワークの基本。

インストールが完了したら、次はAPI自体に取り掛かります。

PyTorchフレームワークの基本

Pyの基本概念を学びましょうTor詳しく見ていく前に。Torchは、numpyのndarrayと同様に、すべての変数にTensorを使用しますが、GPU計算をサポートしています。ここでは、ネットワークモデル、損失関数、バックプロパゲーション、およびオプティマイザについて説明します。

ネットワークモデル

torch.nn をサブクラス化することでネットワークを構築できます。 主要な部分は 2 つあり、

  1. 最初の部分は、使用するパラメータとレイヤーを定義することです。
  2. XNUMX 番目の部分は、入力を受け取り、出力を予測するフォワード プロセスと呼ばれるメイン タスクです。
Import torch
import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):
 def __init__(self):
        super(Model, self).__init__()
        self.conv1 = nn.Conv2d(3, 20, 5)
        self.conv2 = nn.Conv2d(20, 40, 5)
self.fc1 = nn.Linear(320, 10)

def forward(self, x):
       x = F.relu(self.conv1(x))
       x = F.relu(self.conv2(x))
       x = x.view(-1, 320)
       x = F.relu(self.fc1(x))
       return F.log_softmax(x)

net = Model()

上でわかるように、Model という名前の nn.Module のクラスを作成します。 2 つの Conv2d レイヤーと 2 つの Linear レイヤーが含まれています。 最初の conv3d 層は入力 20 と出力形状 20 を受け取ります。40 番目の層は入力 320 を受け取り、出力形状 10 を生成します。最後の層は完全に接続された層で形状 XNUMX を生成し、出力はXNUMX。

フォワード プロセスは X の入力を受け取り、それを conv1 層に供給して ReLU 関数を実行します。

同様に、conv2 レイヤーにもフィードします。 その後、x は (-1, 320) に再形成され、最後の FC レイヤーに入力されます。 出力を送信する前に、softmax アクティベーション関数を使用します。

逆方向プロセスは autograd によって自動的に定義されるため、前方向プロセスを定義するだけで済みます。

損失関数

損失関数は、予測モデルが期待される結果をどれだけ正確に予測できるかを測定するために使用されます。Tortorch.nn モジュールには、ch にすでに多くの標準的な損失関数があります。たとえば、クロスエントロピー損失を使用して多クラス Py を解決できます。Torch分類問題。損失関数を定義し、損失を計算するのは簡単です。

loss_fn = nn.CrossEntropyLoss()

#training process
loss = loss_fn(out, target)

Pyを使えば、独自の損失関数計算を簡単に利用できます。TorCH。

バックプロップ

バックプロパゲーションを実行するには、単に los.backward() を呼び出すだけです。 誤差は計算されますが、zero_grad() を使用して既存の勾配をクリアすることを忘れないでください。

net.zero_grad() # to clear the existing gradient
loss.backward() # to perform backpropragation

オプティマイザ

torch.optim は一般的な最適化アルゴリズムを提供します。簡単な手順でオプティマイザーを定義できます。

optimizer = torch.optim.SGD(net.parameters(), lr = 0.01, momentum=0.9)

バックプロップ プロセスの後に反復ごとにパラメーターが更新されるように、ネットワーク モデルのパラメーターと学習率を渡す必要があります。

APIを学ぶ最も分かりやすい方法は、小規模なエンドツーエンドのサンプルコードを使うことです。

Python を使用した単純な回帰分析Torch

Pythonを使って簡単な回帰分析を学びましょうTorchの例:

ステップ 1) ネットワーク モデルの作成

私たちのネットワーク モデルは、入力形状と出力形状が 1 の単純な線形層です。

from __future__ import print_function

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable

class Net(nn.Module):
   def __init__(self):
       super(Net, self).__init__()
       self.layer = torch.nn.Linear(1, 1)

   def forward(self, x):
       x = self.layer(x)      
       return x

net = Net()
print(net)

そして、ネットワーク出力は次のようになります

Net(
  (hidden): Linear(in_features=1, out_features=1, bias=True)
)

ステップ 2) テストデータ

トレーニング プロセスを開始する前に、データを知る必要があります。 モデルをテストするためにランダム関数を作成します。 Y = x3 sin(x)+3x+0.8ランド(100)

# Visualize our data
import matplotlib.pyplot as plt
import numpy as np

x = np.random.rand(100)
y = np.sin(x) * np.power(x,3) + 3*x + np.random.rand(100)*0.8

plt.scatter(x, y)
plt.show()

関数の散布図は次のとおりです。

Pythonによる単純回帰の散布図Torch

トレーニングプロセスを開始する前に、numpy配列をサポートされている変数に変換する必要があります。 Tor以下のPyに示すように、chとautogradTorch回帰の例。

# convert numpy array to tensor in shape of input size
x = torch.from_numpy(x.reshape(-1,1)).float()
y = torch.from_numpy(y.reshape(-1,1)).float()
print(x, y)

ステップ 3) オプティマイザと損失

次に、トレーニング プロセス用のオプティマイザーと損失関数を定義する必要があります。

# Define Optimizer and Loss Function
optimizer = torch.optim.SGD(net.parameters(), lr=0.2)
loss_func = torch.nn.MSELoss()

ステップ4) トレーニング

それでは、トレーニングプロセスを開始しましょう。 エポックを 250 として、データを反復処理して、ハイパーパラメータの最適な値を見つけます。

inputs = Variable(x)
outputs = Variable(y)
for i in range(250):
   prediction = net(inputs)
   loss = loss_func(prediction, outputs) 
   optimizer.zero_grad()
   loss.backward()        
   optimizer.step()       

   if i % 10 == 0:
       # plot and show learning process
       plt.cla()
       plt.scatter(x.data.numpy(), y.data.numpy())
       plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=2)
       plt.text(0.5, 0, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 10, 'color':  'red'})
       plt.pause(0.1)

plt.show()

ステップ5) 結果

以下に示すように、Py の実行に成功しました。Torニューラルネットワークによるch回帰。実際には、各イテレーションで、プロットの赤い線が更新され、データに適合するように位置が変わります。しかし、この図では、以下のPyに示されている最終結果のみが表示されます。Torchの例:

単回帰結果の散布図

回帰はウォーミングアップであり、画像分類はPyの深層学習能力を鍛える。TorCH。

Py を使用した画像分類の例Torch

の基本を学ぶための人気のある方法の XNUMX つ 深い学習 MNIST データセットです。これはディープラーニングの「Hello World」です。データセットには、0 から 9 までの手書きの数字が含まれ、合計 60,000 個のトレーニング サンプルと、10,000×28 ピクセルのサイズでラベル付け済みの 28 個のテスト サンプルが含まれています。

Pyによる画像分類Torch

ステップ 1) データの前処理

この Py の最初のステップではTorch分類の例では、torchvisionモジュールを使用してデータセットを読み込みます。

トレーニングプロセスを開始する前に、データを理解する必要があります。 Torchvisionはデータセットを読み込み、画像の形状変換や正規化など、ネットワークの要件に合わせて画像を変換します。

import torch
import torchvision
import numpy as np
from torchvision import datasets, models, transforms

# This is used to transform the images to Tensor and normalize it
transform = transforms.Compose(
   [transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

training = torchvision.datasets.MNIST(root='./data', train=True,
                                       download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(training, batch_size=4,
                                         shuffle=True, num_workers=2)

testing = torchvision.datasets.MNIST(root='./data', train=False,
                                      download=True, transform=transform)
test_loader = torch.utils.data.DataLoader(testing, batch_size=4,
                                        shuffle=False, num_workers=2)

classes = ('0', '1', '2', '3',
          '4', '5', '6', '7', '8', '9')
         
import matplotlib.pyplot as plt
import numpy as np

#create an iterator for train_loader
# get random training images
data_iterator = iter(train_loader)
images, labels = data_iterator.next()

#plot 4 images to visualize the data
rows = 2
columns = 2
fig=plt.figure()
for i in range(4):
   fig.add_subplot(rows, columns, i+1)
   plt.title(classes[labels[i]])
   img = images[i] / 2 + 0.5     # this is for unnormalize the image
   img = torchvision.transforms.ToPILImage()(img)
   plt.imshow(img)
plt.show()

変換関数は画像をテンソルに変換し、値を正規化します。 torchvision.transforms.MNIST 関数は、データセット (利用できない場合) をディレクトリにダウンロードし、必要に応じてトレーニング用のデータセットを設定し、変換プロセスを実行します。

データセットを視覚化するには、data_iterator を使用して画像とラベルの次のバッチを取得します。 matplot を使用して、これらのイメージとその適切なラベルをプロットします。 以下に示すように、画像とそのラベルが表示されます。

Py を使用した画像分類の例Torch

ステップ 2) ネットワークモデルの構成

このPyではTor例えば、Python用のシンプルなニューラルネットワークを作成します。Torch画像分類。

ここでは、Pythonでネットワークモデルを作成する別の方法を紹介します。Torch. nn.Module のサブクラスを作成する代わりに、nn.Sequential を使用してシーケンス モデルを作成します。

import torch.nn as nn

# flatten the tensor into 
class Flatten(nn.Module):
   def forward(self, input):
       return input.view(input.size(0), -1)

#sequential based model
seq_model = nn.Sequential(
           nn.Conv2d(1, 10, kernel_size=5),
           nn.MaxPool2d(2),
           nn.ReLU(),
           nn.Dropout2d(),
           nn.Conv2d(10, 20, kernel_size=5),
           nn.MaxPool2d(2),
           nn.ReLU(),
           Flatten(),
           nn.Linear(320, 50),
           nn.ReLU(),
           nn.Linear(50, 10),
           nn.Softmax(),
         )

net = seq_model
print(net)

これがネットワーク モデルの出力です。

Sequential(
  (0): Conv2d(1, 10, kernel_size=(5, 5), stride=(1, 1))
  (1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (2): ReLU()
  (3): Dropout2d(p=0.5)
  (4): Conv2d(10, 20, kernel_size=(5, 5), stride=(1, 1))
  (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (6): ReLU()
  (7): Flatten()
  (8): Linear(in_features=320, out_features=50, bias=True)
  (9): ReLU()
  (10): Linear(in_features=50, out_features=10, bias=True)
  (11): Softmax()
)

ネットワークの説明

  1. このシーケンスでは、最初の層は入力形状 2、出力形状 1、カーネル サイズ 10 の Conv5D 層です。
  2. 次に、MaxPool2D レイヤーを作成します。
  3. ReLU活性化関数
  4. 確率の低い値をドロップするドロップアウト層。
  5. 次に、最後の層からの入力形状 2、出力形状 10、カーネル サイズ 20 を持つ 5 番目の ConvXNUMXd
  6. 次は MaxPool2d レイヤーです
  7. ReLUアクティベーション機能。
  8. その後、テンソルを線形レイヤーにフィードする前に平坦化します。
  9. Linear Layer は、softmax アクティベーション関数を使用して XNUMX 番目の Linear Layer で出力をマッピングします。

ステップ 3) モデルをトレーニングする

トレーニング プロセスを開始する前に、基準とオプティマイザー関数を設定する必要があります。

評価基準には、CrossEntropyLossを使用します。オプティマイザには、以下のPyコードに示すように、学習率0.001、モーメンタム0.9のSGDを使用します。Torchの例。

import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

順方向プロセスは入力形状を取得し、それを最初の conv2d 層に渡します。 次に、そこから maxpool2d にフィードされ、最終的に ReLU アクティベーション関数に入力されます。 同じプロセスが 2 番目の conv1,320d 層でも発生します。 その後、入力は (-XNUMX) に再整形され、fc 層に入力されて出力が予測されます。

ここで、トレーニングプロセスを開始します。 データセットを 2 回またはエポック 2 で反復処理し、2000 バッチごとに現在の損失を出力します。

for epoch in range(2): 

#set the running loss at each epoch to zero
   running_loss = 0.0
# we will enumerate the train loader with starting index of 0
# for each iteration (i) and the data (tuple of input and labels)
   for i, data in enumerate(train_loader, 0):
       inputs, labels = data

# clear the gradient
       optimizer.zero_grad()

#feed the input and acquire the output from network
       outputs = net(inputs)

#calculating the predicted and the expected loss
       loss = criterion(outputs, labels)

#compute the gradient
       loss.backward()

#update the parameters
       optimizer.step()

       # print statistics
       running_loss += loss.item()
       if i % 1000 == 0:
           print('[%d, %5d] loss: %.3f' %
                 (epoch + 1, i + 1, running_loss / 1000))
           running_loss = 0.0

各エポックで、列挙子は入力と対応するラベルの次のタプルを取得します。 入力をネットワーク モデルにフィードする前に、前の勾配をクリアする必要があります。 これが必要なのは、逆方向プロセス (バックプロパゲーション プロセス) の後、勾配が置き換えられずに蓄積されるためです。 次に、期待出力から予測出力からの損失を計算します。 その後、バックプロパゲーションを実行して勾配を計算し、最後にパラメーターを更新します。

トレーニングプロセスの出力は次のとおりです

[1, 	1] loss: 0.002
[1,  1001] loss: 2.302
[1,  2001] loss: 2.295
[1,  3001] loss: 2.204
[1,  4001] loss: 1.930
[1,  5001] loss: 1.791
[1,  6001] loss: 1.756
[1,  7001] loss: 1.744
[1,  8001] loss: 1.696
[1,  9001] loss: 1.650
[1, 10001] loss: 1.640
[1, 11001] loss: 1.631
[1, 12001] loss: 1.631
[1, 13001] loss: 1.624
[1, 14001] loss: 1.616
[2, 	1] loss: 0.001
[2,  1001] loss: 1.604
[2,  2001] loss: 1.607
[2,  3001] loss: 1.602
[2,  4001] loss: 1.596
[2,  5001] loss: 1.608
[2,  6001] loss: 1.589
[2,  7001] loss: 1.610
[2,  8001] loss: 1.596
[2,  9001] loss: 1.598
[2, 10001] loss: 1.603
[2, 11001] loss: 1.596
[2, 12001] loss: 1.587
[2, 13001] loss: 1.596
[2, 14001] loss: 1.603

ステップ 4) モデルをテストする

モデルをトレーニングした後、他の画像セットを使用してテストまたは評価する必要があります。

test_loader のイテレータを使用して、トレーニング済みモデルに渡される画像とラベルのバッチを生成します。予測された出力が表示され、期待される出力と比較されます。

#make an iterator from test_loader
#Get a batch of training images
test_iterator = iter(test_loader)
images, labels = test_iterator.next()

results = net(images)
_, predicted = torch.max(results, 1)

print('Predicted: ', ' '.join('%5s' % classes[predicted[j]] for j in range(4)))

fig2 = plt.figure()
for i in range(4):
   fig2.add_subplot(rows, columns, i+1)
   plt.title('truth ' + classes[labels[i]] + ': predict ' + classes[predicted[i]])
   img = images[i] / 2 + 0.5     # this is to unnormalize the image
   img = torchvision.transforms.ToPILImage()(img)
   plt.imshow(img)
plt.show()

Py を使用した画像分類の例Torch

よくあるご質問

ほとんどの学習者にとってはい。Torchの熱心な実行、 Pythonic APIとHugging Faceアライメントにより学習が容易になります。調査によると、初心者の60%がPyを選択しています。Torch が最初です。

Copilot、Cursor、およびなどのAIアシスタント JetBrains AIがPyを生成するTorch トレーニング ループ、レイヤー アーキテクチャの提案、およびテンソル形状エラーのデバッグ。Hugging Face Transformers には Py も同梱されています。Torch-firstモデル。

はい。AIツールはnn.Moduleクラス、オプティマイザの選択、トレーニングループの骨組みを構築します。また、CUDAエラーの説明、混合精度フラグの提案、データセットの形状に基づくバッチサイズの推奨も行います。

PyTorch は動的グラフを使用し、研究を支配しています。TensorFlow は TensorFlow Lite を通じてモバイルおよびエッジでの実運用展開をリードしています。Py の torch.compile のおかげでパフォーマンスの差は縮まりました。Tor2ch。

ディープラーニングの研究論文の約85%はPythonを使用している。Tor2026年にch。動的グラフモデルは実験に適しており、Hugging FaceからvLLMまでのLLMエコシステム全体がPyを中心に構築されています。TorCH。

PyTorch は CPU と CUDA GPU 上でネイティブに動作し、AMD GPU 上では ROCm、Apple Silicon 上では MPS、Py を介して TPU をサポートします。Torch XLAプロジェクト。.to()呼び出しを使用して適切なデバイスを選択します。

はい、 TorchServe、ONNXエクスポート、および新しいExecuTorch ランタイム。TensorFlow Lite はモバイル向けにはより成熟していますが、PyTorchはエッジ推論において急速に差を縮めている。

初心者であれば、最初のネットワークは1~2日で構築できます。CNN、トランスフォーマー、分散学習、本番環境への展開を習得するには、通常、3~6ヶ月間の継続的なプロジェクト作業が必要です。