PyTorch と NumPy の徹底比較! ! !

PyTorch と NumPy の徹底比較! ! !

こんにちは、Xiaozhuangです!

pytorch のコンテンツを更新するように多くの人から促されており、最近多くのことをまとめました。

実践的な操作と概要コンテンツが含まれています。

pytorch と numpy の境界については漠然とした認識を持っている人が多いと思います。今日はそれを整理し、いくつかの側面から詳しく説明します。

各知識ポイントは簡単なものから実際のコードまで比較されており、集めてゆっくり読む価値があります〜

以下の点から全コンテンツを比較しました。

  • ディープラーニングのサポート: PyTorch はディープラーニング タスクに重点を置いており、動的な計算グラフと組み込みのニューラル ネットワーク インターフェイスを提供しますが、NumPy は主に従来の科学計算に使用され、ディープラーニング モジュールがありません。
  • 自動微分: PyTorch には自動微分機能があり、ニューラル ネットワークの構築とトレーニングをより柔軟に行うことができますが、NumPy では導関数を手動で計算する必要があります。
  • GPU アクセラレーション: PyTorch には GPU サポートが組み込まれているため、GPU でのテンソル計算とモデル トレーニングがより便利になりますが、NumPy では GPU アクセラレーションを実現するために追加のライブラリ (CuPy など) が必要です。
  • モデルのデプロイメント: PyTorch は、モデルのエクスポートとデプロイメントを容易にする TorchScript や ONNX などのツールを提供しますが、NumPy では通常、モデルのエクスポートとデプロイメントを実現するために追加のライブラリと手動作業が必要になります。

つまり、最も重要な点は、NumPy は主にデータ計算を担当し、PyTorch はディープラーニング タスクに適しており、より豊富なツールとインターフェイスを提供していることです。

6 つのパートに分かれており、次の内容をカバーしています。

  • テンソル計算
  • 自動微分
  • ディープラーニングのサポート
  • GPUアクセラレーション
  • モデルの展開
  • コーディングスタイル

さあ、見てみましょう〜

1. テンソル計算

  • NumPy: 主に配列演算に使用され、特殊なテンソル計算関数は提供されません。 NumPy 配列は静的であり、自動微分化をサポートしていません。
  • PyTorch: 動的な計算グラフと自動微分化を提供し、ディープラーニングタスクに適しています。 PyTorch のテンソル計算機能はより柔軟で、ニューラル ネットワーク モデルを簡単に構築できます。

テンソル計算は PyTorch と NumPy の重要な側面であり、どちらも多次元配列 (テンソル) を操作する必要があります。

1. テンソルの作成

数値パイ:

 import numpy as np # 创建NumPy数组np_array = np.array([[1, 2, 3], [4, 5, 6]]) # 查看数组属性print("NumPy Array:") print(np_array) print("Shape:", np_array.shape)

パイトーチ:

 import torch # 创建PyTorch张量torch_tensor = torch.tensor([[1, 2, 3], [4, 5, 6]]) # 查看张量属性print("PyTorch Tensor:") print(torch_tensor) print("Shape:", torch_tensor.shape)

2. テンソル演算

数値パイ:

 # NumPy数组运算np_array1 = np.array([[1, 2, 3], [4, 5, 6]]) np_array2 = np.array([[7, 8, 9], [10, 11, 12]]) result_np = np_array1 + np_array2 # 或者使用np.add(np_array1, np_array2) print("NumPy Array Addition:") print(result_np)

パイトーチ:

 # PyTorch张量运算torch_tensor1 = torch.tensor([[1, 2, 3], [4, 5, 6]]) torch_tensor2 = torch.tensor([[7, 8, 9], [10, 11, 12]]) result_torch = torch_tensor1 + torch_tensor2 # 或者使用torch.add(torch_tensor1, torch_tensor2) print("PyTorch Tensor Addition:") print(result_torch)

3. 自動微分化

数値パイ:

 # NumPy不支持自动微分,需要手动计算导数x_np = np.array([2.0], dtype=float) y_np = x_np**2 dy_dx_np = 2 * x_np print("NumPy Manual Differentiation:") print("Input:", x_np) print("Output:", y_np) print("Derivative:", dy_dx_np)

パイトーチ:

 # PyTorch支持自动微分x_torch = torch.tensor([2.0], requires_grad=True) y_torch = x_torch**2 y_torch.backward() dy_dx_torch = x_torch.grad print("PyTorch Autograd:") print("Input:", x_torch) print("Output:", y_torch) print("Derivative:", dy_dx_torch)

4. GPUアクセラレーション

数値パイ:

 # NumPy需要额外的库(如CuPy)才能实现GPU加速

パイトーチ:

 # PyTorch内置GPU支持device = torch.device("cuda" if torch.cuda.is_available() else "cpu") torch_tensor = torch_tensor.to(device)

5. モデル構築

数値パイ:

 # NumPy通常用于传统的科学计算,没有专门的深度学习模块

パイトーチ:

 # PyTorch提供了高级的神经网络构建接口import torch.nn as nn class SimpleModel(nn.Module): def __init__(self): super(SimpleModel, self).__init__() self.fc = nn.Linear(3, 1) def forward(self, x): return self.fc(x) model = SimpleModel()

これらの例は、特に自動微分化と GPU アクセラレーションに関して、ディープラーニング タスクにおける PyTorch の強みを強調しています。ただし、NumPy は依然として、従来の科学計算タスクにおいて非常に強力で広く使用されているツールです。

2. 自動微分化

  • NumPy: 自動微分機能がなく、導関数を手動で計算する必要があります。
  • PyTorch: 動的な計算グラフと自動微分化を提供し、ニューラル ネットワークでのバックプロパゲーションをより簡単に、より直感的にします。

自動微分により、計算グラフ内の変数の勾配を自動的に計算できます。この点では、PyTorch と NumPy は大きく異なります。

基本的な操作から比較できます。Numpy では手動微分しかできません。

1. 自動微分化

  • NumPy: NumPy には自動微分機能が組み込まれていません。勾配を計算する場合は、微分を手動で計算するか、差分などの数値手法を使用する必要があります。
  • PyTorch: PyTorch は動的計算グラフを使用して自動微分化を実装します。操作が実行されるたびに、PyTorch はバックグラウンドで計算グラフを構築し、バックプロパゲーションによって勾配を自動的に計算できます。

2. NumPyでの手動微分

import numpy as np # NumPy中的手动微分x_np = np.array([2.0], dtype=float) y_np = x_np**2 dy_dx_np = 2 * x_np print("NumPy Manual Differentiation:") print("Input:", x_np) print("Output:", y_np) print("Derivative:", dy_dx_np)

NumPy では、導関数を手動で計算する必要があります。上記の例は、関数 y=x^2 を手動で微分するプロセスを示しています。

3. PyTorch での自動微分

import torch # PyTorch中的自动微分x_torch = torch.tensor([2.0], requires_grad=True) y_torch = x_torch**2 y_torch.backward() dy_dx_torch = x_torch.grad print("PyTorch Autograd:") print("Input:", x_torch) print("Output:", y_torch) print("Derivative:", dy_dx_torch)

PyTorch では、requires_grad を True に設定し、forward pass と backward() を実行するだけで、勾配が自動的に計算されます。 grad 属性は計算された勾配を保持します。

4. 動的計算グラフ

  • NumPy: NumPy は、計算前に操作を完全に定義する必要があるため、静的な計算グラフを使用します。
  • PyTorch: PyTorch は動的計算グラフを使用します。つまり、計算グラフは実行時に構築され、必要に応じて柔軟に変更できます。

5. より複雑な例 - 勾配降下法

# PyTorch中使用梯度下降learning_rate = 0.1 num_iterations = 100 x_torch = torch.tensor([2.0], requires_grad=True) for _ in range(num_iterations): y_torch = x_torch**2 y_torch.backward() # 使用梯度下降更新参数x_torch.data = x_torch.data - learning_rate * x_torch.grad.data # 梯度清零x_torch.grad.zero_() print("Final Result after Gradient Descent:", x_torch.data)

この例では、勾配降下法を使用して単純な関数 (y=x^2) のパラメータを最適化する方法を示します。 PyTorch は、自動微分を通じて勾配を計算して適用する便利な方法を提供します。各反復で、backward() は勾配を計算し、勾配降下法によってパラメータを更新します。

3. ディープラーニングのサポート

  • NumPy: 主に従来の科学計算に使用され、専用のディープラーニング モジュールはありません。
  • PyTorch: ディープラーニングタスクに焦点を当て、torch.nn や torch.optim などの高度なニューラル ネットワーク構築およびトレーニング インターフェイスを提供します。

PyTorch はディープラーニングタスクに重点を置いており、高度なニューラルネットワーク構築とトレーニングインターフェースを提供しますが、NumPy は従来の科学計算に適しています。

1. ニューラルネットワークの構築

NumPy は主に配列演算と科学計算に使用され、ディープラーニング モジュールは組み込まれていません。ニューラル ネットワークを構築するには、ネットワーク レイヤーとアクティベーション関数を手動で実装する必要があります。 PyTorch は、さまざまな定義済みネットワーク レイヤーとアクティベーション関数を含む torch.nn モジュールを提供します。

 import torch import torch.nn as nn # 定义神经网络class SimpleNet(nn.Module): def __init__(self): super(SimpleNet, self).__init__() self.fc1 = nn.Linear(10, 5) self.relu = nn.ReLU() self.fc2 = nn.Linear(5, 1) def forward(self, x): x = self.fc1(x) x = self.relu(x) x = self.fc2(x) return x # 创建模型实例model = SimpleNet()

2. 損失関数とオプティマイザー

NumPy では、損失関数とオプティマイザーを手動で実装する必要があります。これには通常、勾配降下法などの最適化アルゴリズムの使用が必要です。 PyTorch は、トレーニング プロセスを容易にするために、さまざまな組み込み損失関数とオプティマイザーを提供します。

簡単なトレーニング プロセスの例を次に示します。

 import torch.optim as optim # 定义损失函数和优化器criterion = nn.MSELoss() optimizer = optim.SGD(model.parameters(), lr=0.01) # 训练过程for epoch in range(num_epochs): # 前向传播outputs = model(inputs) loss = criterion(outputs, targets) # 反向传播和优化optimizer.zero_grad() loss.backward() optimizer.step()

3. 自動微分とバックプロパゲーション

NumPy は自動微分とバックプロパゲーションをサポートしていません。手動で勾配を計算し、バックプロパゲーション プロセスを実装する必要があります。 PyTorch の動的計算グラフと自動微分化により、バックプロパゲーションが容易になります。上記の例では、 loss.backward() は勾配を自動的に計算し、バックプロパゲーションを実行できます。

4. GPUアクセラレーション

NumPy では、GPU アクセラレーションのために CuPy などの追加ライブラリが必要です。 PyTorch には GPU サポートが組み込まれており、テンソル計算とモデル トレーニングを GPU 上で直接実行できます。モデルを GPU に移動する例を次に示します。

 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model.to(device)

5. モデルの保存と読み込み

  • NumPy: モデルの保存と読み込みは、通常、NumPy の np.save と np.load を使用して手動で実装する必要があります。
  • PyTorch: PyTorch は、便利なモデルの保存および読み込みインターフェースを提供します。モデルの保存と読み込みの例を次に示します。
 # 保存模型torch.save(model.state_dict(), 'model.pth') # 加载模型model.load_state_dict(torch.load('model.pth'))

4. GPUアクセラレーション

  • NumPy: ネイティブ NumPy は GPU アクセラレーションをサポートしていませんが、CuPy などの拡張ライブラリを通じて実現できます。
  • PyTorch: GPU サポートが組み込まれており、テンソル計算を GPU 上で直接実行し、ディープラーニング モデルのトレーニング速度を向上させることができます。

GPU アクセラレーションは、ディープラーニングにおける計算速度を向上させる重要な要素の 1 つです。この点において、PyTorch と NumPy にはいくつかの重要な違いがあります。

以下は、GPU アクセラレーションの詳細な説明とコード比較です。

1. GPUアクセラレーションのコンセプト

  • NumPy: NumPy 自体は GPU アクセラレーションをサポートしていません。 GPU で操作を実行する必要がある場合は、NumPy 配列の代わりに CuPy などの追加ライブラリを使用する必要がある場合があります。
  • PyTorch: PyTorch には CUDA (NVIDIA GPU アクセラレーション) のサポートが組み込まれており、テンソル計算とモデル トレーニングを GPU 上で直接実行できます。

2. PyTorch で GPU を使用する

import torch # 检查GPU是否可用device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 创建张量并将其移动到GPU tensor_on_cpu = torch.tensor([1, 2, 3]) tensor_on_gpu = tensor_on_cpu.to(device)

上記のコードは、GPU が使用可能かどうかを確認し、PyTorch テンソルを GPU に移動する方法を示しています。これは、PyTorch で GPU アクセラレーションを使用するための基本的な手順です。

3. NumPy で GPU を使用する (CuPy を使用)

 import cupy as np # 使用CuPy代替NumPy # 创建CuPy数组array_on_gpu = np.array([1, 2, 3])

NumPy の場合、CuPy を使用することで GPU アクセラレーションを実現できます。 CuPy は NumPy と同様のインターフェースを提供しますが、GPU 上で操作を実行します。

4. PyTorchでのGPUアクセラレーショントレーニング

import torch import torch.nn as nn import torch.optim as optim # 创建模型和数据model = nn.Linear(5, 1) data = torch.randn((100, 5)).to(device) target = torch.randn((100, 1)).to(device) # 将模型和数据移动到GPU model.to(device) # 定义损失函数和优化器criterion = nn.MSELoss() optimizer = optim.SGD(model.parameters(), lr=0.01) # 在GPU上进行训练for epoch in range(num_epochs): outputs = model(data) loss = criterion(outputs, target) optimizer.zero_grad() loss.backward() optimizer.step()

上記のコードは、PyTorch で GPU アクセラレーション トレーニングを実行する方法を示しています。この例では、モデル、入力データ、ターゲット データがすべて GPU に移動されます。

5. NumPyとPyTorchのGPUアクセラレーション性能の比較

大規模なデータと複雑なモデルを伴うディープラーニング タスクでは、通常、PyTorch の GPU アクセラレーションの方が便利で、パフォーマンスも優れています。これは主に、PyTorch がディープラーニング タスクを念頭に置いて設計されているのに対し、NumPy は一般的な科学計算に重点を置いているためです。

5. モデルの展開

  • NumPy: モデルのデプロイメントには、コードを他のフレームワークに変換したり、専用のツールを使用したりする必要がある場合があります。
  • PyTorch: 簡単に展開できるように、さまざまな環境で実行できる形式でモデルをエクスポートするためのツール (TorchScript など) を提供します。

モデルのデプロイメントは、トレーニング済みのディープラーニング モデルを実際の運用環境に適用するプロセスです。この点では、PyTorch と NumPy には、特にモデルのエクスポートとデプロイメントにおいていくつかの違いがあります。

以下は、モデル展開の詳細な説明とコード比較です。

1. PyTorchでのモデルの保存と読み込み

PyTorch では、torch.save と torch.load を使用して、モデル全体またはモデルのパラメータを保存および読み込むことができます。

 import torch import torch.nn as nn # 定义一个简单的模型class SimpleModel(nn.Module): def __init__(self): super(SimpleModel, self).__init__() self.fc = nn.Linear(10, 1) def forward(self, x): return self.fc(x) model = SimpleModel() # 保存整个模型torch.save(model, 'model.pth') # 或者只保存模型的参数torch.save(model.state_dict(), 'model_params.pth') # 加载模型loaded_model = torch.load('model.pth') loaded_model_params = SimpleModel() loaded_model_params.load_state_dict(torch.load('model_params.pth'))

2. NumPyでのモデルの保存と読み込み

NumPy では、numpy.save と numpy.load を使用して NumPy 配列を保存および読み込むことができますが、モデルの保存には通常、Joblib などの他のライブラリを使用する必要があります。

 import numpy as np from sklearn.externals import joblib # 使用Joblib保存和加载模型model = ... # 的模型joblib.dump(model, 'model.joblib') loaded_model = joblib.load('model.joblib')

3. トーチスクリプト

PyTorch では TorchScript が導入され、これにより PyTorch モデルをさまざまな環境で実行できる中間表現としてエクスポートできるようになりました。これにより、モデルの展開にさらに柔軟なオプションが提供されます。

 import torch # 定义并导出模型为TorchScript class SimpleModel(torch.jit.ScriptModule): def __init__(self): super(SimpleModel, self).__init__() self.fc = torch.nn.Linear(10, 1) @torch.jit.script_method def forward(self, x): return self.fc(x) model = SimpleModel() traced_model = torch.jit.trace(model, torch.rand(1, 10)) # 保存TorchScript模型traced_model.save("traced_model.pt") # 加载TorchScript模型loaded_model = torch.jit.load("traced_model.pt")

4. オンネクス

ONNX (Open Neural Network Exchange) は、異なるディープラーニング フレームワーク間でモデルを共有できるようにするオープン スタンダードです。 PyTorch はモデルを ONNX 形式にエクスポートできます。

 import torch import torch.onnx # 定义并导出模型为ONNX class SimpleModel(torch.nn.Module): def __init__(self): super(SimpleModel, self).__init__() self.fc = torch.nn.Linear(10, 1) def forward(self, x): return self.fc(x) model = SimpleModel() dummy_input = torch.randn(1, 10) # 导出模型为ONNX torch.onnx.export(model, dummy_input, "model.onnx", verbose=True) # 可以使用ONNX Runtime或其他支持ONNX的库来部署模型

5. 導入時の注意点

  • 依存関係: PyTorch や NumPy などの正しい依存関係がデプロイメント環境にインストールされていることを確認します。
  • ハードウェアの互換性: 展開環境のハードウェアがモデルと互換性があることを確認します。たとえば、モデルが GPU でトレーニングされた場合は、デプロイメント環境に対応する GPU があることを確認します。
  • 推論速度: 大規模な展開では、モデルのサイズを縮小し、推論速度を向上させるために、モデルの量子化やプルーニングなどの手法の使用を検討してください。

要約すると、PyTorch はモデルのエクスポートとデプロイメントのためのツールとライブラリをさらに提供し、さまざまな環境でのデプロイメントを容易にします。 NumPy はこの点で比較的基本的なため、通常はモデルのエクスポートとデプロイメントを実装するために追加の作業が必要になります。

6. コーディングスタイル

  • NumPy: 一般的に、手続き型プログラミング スタイルを使用します。
  • PyTorch: モデル構築に PyTorch の torch.nn モジュールを使用する、よりオブジェクト指向的です。

コーディング スタイルは、読みやすく保守しやすいコードを記述するための規則です。ディープラーニングでは、PyTorch と NumPy のコーディングスタイルに若干の違いがあります。以下にコーディング スタイルの詳細な説明と比較を示します。

1. コードレイアウト

  • NumPy: NumPy は通常、手続き型プログラミング スタイルを使用します。コード レイアウトは、配列操作と数学演算がメイン プログラム内に分散されている従来の科学計算スクリプトに近いと考えられます。
 import numpy as np # NumPy数组操作array_a = np.array([1, 2, 3]) array_b = np.array([4, 5, 6]) result = array_a + array_b print(result)
  • PyTorch: PyTorch は、特に torch.nn モジュールを使用してニューラル ネットワークを構築する場合、よりオブジェクト指向的です。コードには通常、モデル定義、トレーニング ループ、評価などの段階が含まれます。
 import torch import torch.nn as nn # PyTorch神经网络class SimpleNet(nn.Module): def __init__(self): super(SimpleNet, self).__init__() self.fc = nn.Linear(3, 1) def forward(self, x): return self.fc(x) # 使用模型model = SimpleNet() input_data = torch.randn((10, 3)) output = model(input_data) print(output)

2. 変数とテンソルの命名

  • NumPy: 変数名には通常、array_a のように小文字とアンダースコアが使用されます。
  • PyTorch: テンソルとモデル パラメータは通常、inputData や modelParameters のように、キャメルケースで名前が付けられます。

3. 自動微分と勾配更新

  • NumPy: NumPy は自動微分と勾配更新をサポートしていません。導関数を手動で計算する場合、変数と演算は通常すべて同じブロック内にあります。
  • PyTorch: PyTorch の自動微分化により、勾配の更新がより直感的になり、通常は backward() とオプティマイザーが使用されます。
 import torch # PyTorch自动微分x = torch.tensor([2.0], requires_grad=True) y = x**2 y.backward() print(x.grad)

4. 例外処理

  • NumPy: 例外処理では、従来の try および except ステートメントが使用される場合があります。
 import numpy as np # NumPy异常处理try: result = np.divide(1, 0) except ZeroDivisionError as e: print("Error:", e)
  • PyTorch: PyTorch は通常、モデル パラメータなどの問題を処理するために torch.nn.Module 内の例外を使用します。
 import torch import torch.nn as nn # PyTorch异常处理class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() self.fc = nn.Linear(3, 1) model = MyModel() try: output = model(torch.tensor([1, 2, 3])) except nn.modules.module.ModuleAttributeError as e: print("Error:", e)

5. コードコメント

  • NumPy: コメントは、複雑なアルゴリズムや特殊な操作を説明するためによく使用されます。
  • PyTorch: ディープラーニングには多くの独自の操作が含まれるため、モデル構造、トレーニング手順、勾配更新などを説明するために注釈が使用されます。
 import torch import torch.nn as nn # PyTorch代码注释class SimpleNet(nn.Module): def __init__(self): """构造函数,定义神经网络结构。 """ super(SimpleNet, self).__init__() self.fc = nn.Linear(3, 1) def forward(self, x): """前向传播函数,定义数据如何在网络中传播。 """ return self.fc(x) # 使用模型model = SimpleNet() input_data = torch.randn((10, 3)) output = model(input_data)

全体的に、NumPy と PyTorch はそれぞれ従来の科学計算とディープラーニングに使用されるため、コーディング スタイルが若干異なります。

<<:  人工知能時代のデータストレージの未来

>>:  マイクロソフトはAIを活用して新しい電池材料を選別し、電池のリチウムの70%をナトリウムに置き換える

推薦する

AIを優先する際にITの基礎を軽視してはいけない

GenAI は多くの企業の IT プロジェクトで引き続き主流を占めており、ビジネス リーダーの 3 ...

顔認識技術とは何ですか?適用シナリオは何ですか?

顔認識機能は、店舗への入店時、サービスプロセス中、チェックアウト前など、小売業者が顧客の身元(Ope...

加速を解き放つ、8月の自動運転業界の動向の概要

[[419694]]チップ不足と疫病の影響により、今年初めから自動運転産業の発展は減速を余儀なくされ...

マイクロソフトがCopilot for Financeをリリース、AIでスプレッドシートに革命を起こすことを目指す

Microsoft が新たにリリースした AI アシスタントは、増え続ける財務データの中から適切な情...

独自のビッグデータ知識システムを迅速かつ包括的に構築するにはどうすればよいでしょうか?

多くの人がさまざまな種類の本を読み、ビッグデータに関する多くの記事に出会ったことがありますが、それら...

RadOcc: レンダリング支援蒸留によるクロスモーダル占有知識の学習

原題: Radocc: レンダリング支援蒸留によるクロスモダリティ占有知識の学習論文リンク: htt...

Agent4Recが登場!大規模なモデルエージェントは、実際のユーザーインタラクション動作をシミュレートする推奨システムシミュレーターを構成します。

推奨システムの分野では、モデルのオンラインとオフラインのパフォーマンスに大きなギャップがあるという問...

...

ReSimAD: 実データなしで知覚モデルの一般化パフォーマンスを向上させる方法

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

雲智盛 梁 嘉恩: インテリジェントインタラクション技術とモノのインターネットアプリケーション

[51CTO.comより引用] 2017年7月21日から22日まで、51CTO主催の人工知能をテーマ...

...

人工知能の実用化を加速させるには

人工知能と機械学習ソリューションは、今日、さまざまな業界の組織で一般的になりつつあります。組織が A...

...

ベイジアンアルゴリズムは「アプリチケット詐欺」を打破する良い方法となるだろう

最近、世間を騒がせた360 Appランキング操作事件とその背後にある闇産業チェーンの出現により、Ap...