[機械学習のはじめ方] Part36: TensorFlowとPyTorchの基本構文

機械学習

はじめに

機械学習、特にディープラーニングの世界へようこそ!🎉 このステップでは、現在の深層学習フレームワークの二大巨頭であるTensorFlowPyTorchの基本的な使い方、特に構文に焦点を当てて解説します。どちらも非常に強力で広く使われているライブラリですが、コードの書き方や設計思想にいくつか違いがあります。

このセクションを終える頃には、それぞれのフレームワークで基本的な処理(テンソルの作成、簡単な演算、モデルの層の定義など)をどのように書くのか、その雰囲気をつかめるはずです。どちらのフレームワークをメインで使うにしても、両方の基本を知っておくことは、他の人のコードを読んだり、将来的に使い分けたりする上で役立ちますよ! 😊

TensorFlowの基本構文

TensorFlowはGoogleが開発したフレームワークで、特に大規模なデプロイメントやエコシステムの充実度に強みがあります。TensorFlow 2.0以降、Kerasという高レベルAPIが統合され、モデル構築が非常に簡単になりました。初心者にも扱いやすくなっています。

テンソル(Tensor) はTensorFlowの基本データ構造です。NumPyの配列(ndarray)に似た多次元配列で、GPUでの高速計算に対応しています。

テンソルの作成と基本演算:


import tensorflow as tf

# 定数テンソルの作成
tensor_a = tf.constant([[1.0, 2.0], [3.0, 4.0]])
print("Tensor A:\n", tensor_a)

# ゼロで埋められたテンソルの作成
tensor_b = tf.zeros((2, 2))
print("Tensor B:\n", tensor_b)

# テンソルの足し算
tensor_add = tf.add(tensor_a, tensor_b)
print("A + B:\n", tensor_add)

# テンソルの要素ごとの掛け算
tensor_mul = tf.multiply(tensor_a, tensor_a)
print("A * A:\n", tensor_mul)

# 行列積
tensor_matmul = tf.matmul(tensor_a, tensor_a)
print("A @ A:\n", tensor_matmul)
      

tf.kerasを使った簡単なモデル定義:

tf.kerasを使うと、層を積み重ねるように直感的にモデルを定義できます。


import tensorflow as tf
from tensorflow.keras import layers

# Sequentialモデル(層を順番に重ねる)の定義
model = tf.keras.Sequential([
    # 全結合層(Dense): ユニット数=64, 活性化関数=ReLU
    layers.Dense(64, activation='relu', input_shape=(784,)),
    # ドロップアウト層: 過学習を防ぐため、20%のユニットを無効化
    layers.Dropout(0.2),
    # 出力層: ユニット数=10, 活性化関数=Softmax(多クラス分類用)
    layers.Dense(10, activation='softmax')
])

# モデルの概要を表示
model.summary()
      

TensorFlow (Keras) では、tf.keras.SequentialやFunctional APIを使ってモデルを定義し、model.compile()で損失関数や最適化手法を設定、model.fit()で学習を実行するのが一般的な流れです。

💡 ポイント: TensorFlowはtf.keras APIを使うことで、初心者でも比較的簡単にモデルを構築・学習できます。また、TensorBoardという強力な可視化ツールが統合されており、学習の進捗やモデル構造を簡単に確認できます。

PyTorchの基本構文

PyTorchはFacebook (Meta)が主導して開発しているフレームワークで、Pythonとの親和性が高く、より柔軟なモデル構築が可能です。特に研究コミュニティで人気があります。動的計算グラフを採用しているため、デバッグがしやすいという特徴があります。

PyTorchでも基本データ構造はテンソル(Tensor)です。

テンソルの作成と基本演算:


import torch

# テンソルの作成
tensor_a = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
print("Tensor A:\n", tensor_a)

# ゼロで埋められたテンソルの作成 (requires_grad=Trueで勾配計算を追跡)
tensor_b = torch.zeros((2, 2), requires_grad=True)
print("Tensor B:\n", tensor_b)

# テンソルの足し算
tensor_add = torch.add(tensor_a, tensor_b)
# または tensor_add = tensor_a + tensor_b
print("A + B:\n", tensor_add)

# テンソルの要素ごとの掛け算
tensor_mul = torch.mul(tensor_a, tensor_a)
# または tensor_mul = tensor_a * tensor_a
print("A * A:\n", tensor_mul)

# 行列積
tensor_matmul = torch.matmul(tensor_a, tensor_a)
# または tensor_matmul = tensor_a @ tensor_a
print("A @ A:\n", tensor_matmul)
      

torch.nnを使った簡単なモデル定義:

PyTorchでは、torch.nn.Moduleを継承したクラスとしてモデルを定義するのが一般的です。


import torch
import torch.nn as nn
import torch.nn.functional as F # 活性化関数などを含む

# nn.Moduleを継承してモデルクラスを定義
class SimpleNet(nn.Module):
    def __init__(self):
        super(SimpleNet, self).__init__()
        # 層の定義 (入力784次元, 中間層64次元, 出力10次元)
        self.fc1 = nn.Linear(784, 64) # 全結合層
        self.dropout = nn.Dropout(0.2) # ドロップアウト層
        self.fc2 = nn.Linear(64, 10) # 全結合層

    # 順伝播の定義
    def forward(self, x):
        x = self.fc1(x)
        x = F.relu(x) # ReLU活性化関数
        x = self.dropout(x)
        x = self.fc2(x)
        output = F.log_softmax(x, dim=1) # Softmax活性化関数 (LogSoftmaxがNLLLossと合わせて使われることが多い)
        return output

# モデルのインスタンス化
model = SimpleNet()

# モデルの構造を表示
print(model)
      

PyTorchでは、モデル定義、損失関数の定義、オプティマイザの定義、そして学習ループ(データのロード、順伝播、損失計算、逆伝播、パラメータ更新)を自分で記述することが多いです。これにより、より細かい制御が可能になります。

TensorFlowとPyTorchの簡単な比較

どちらのフレームワークも非常に高機能ですが、構文や設計思想には上記のような違いがあります。

特徴TensorFlow (tf.keras)PyTorch
APIスタイル高レベルAPI (Keras) が統合され、宣言的で使いやすいよりPythonicで命令的。細かい制御がしやすい
計算グラフTensorFlow 2.xはデフォルトでEager Execution (動的)。tf.functionで静的グラフにコンパイル可能動的計算グラフ (Define-by-Run)
モデル定義tf.keras.SequentialやFunctional APIが主流torch.nn.Moduleを継承したクラス定義が主流
学習ループmodel.fit()で抽象化されていることが多い(カスタムループも可能)自分で記述することが多い
デバッグEager Executionで容易になったが、tf.function内はやや注意が必要Pythonのデバッガ (pdbなど) が使いやすく、デバッグしやすい
エコシステムTensorFlow Extended (TFX), TensorFlow Lite, TensorFlow.jsなど、本番環境へのデプロイツールが充実TorchServe, TorchScript, ONNX経由でのデプロイなど、エコシステムも拡大中
コミュニティGoogle主導。商用利用実績が豊富Meta主導。研究コミュニティで特に活発

どちらが良いかは目的や好みによります。初心者はKeras APIの使いやすさからTensorFlowを始めることが多いかもしれませんが、研究や最新論文の実装を追いたい場合はPyTorchが有利な場面もあります。幸い、基本的な考え方(テンソル、自動微分、層構造など)は共通しているので、一方を学べばもう一方への移行も比較的スムーズです。

まとめ

今回は、TensorFlowとPyTorchの基本的な構文の違いを中心に見てきました。

  • どちらもテンソルを基本データ構造として使用する。
  • TensorFlow (Keras) は高レベルAPIでモデル構築が直感的。
  • PyTorch はよりPythonicで柔軟性が高く、デバッグしやすい。
  • モデル定義や学習ループの記述方法にスタイルの違いがある。

実際にコードを書いて動かしてみるのが一番の近道です! 🏃💨 次のステップでは、これらのフレームワークを使って、より具体的なモデル(CNNやRNNなど)を構築していきます。楽しみにしていてくださいね!

コメント

タイトルとURLをコピーしました