TensorFlowとPyTorchの違いは?Kerasは何が違う?|NumPyから整理するDeep Learningフレームワーク入門

AI
スポンサーリンク

はじめに

Deep Learningを勉強していると、こんな疑問が出てきます。

「TensorFlowとPyTorchって何が違うの?」
「KerasってTensorFlowとは別物なの?」
「結局、これからDeep Learningを勉強するなら何を使えばいいの?」

私自身、Deep Learningを勉強していく中で、この3つの関係が少し分かりにくいと感じました。

  • TensorFlow
  • Keras
  • PyTorch

どれもDeep Learningで頻繁に登場するため、

「結局、全部同じようなものなのでは?」

と思ってしまいます。

しかし、実際には3つは同じ種類のものではありません。

特に重要なのが、TensorFlowとPyTorchの関係です。

TensorFlowとPyTorchは、どちらもDeep Learningの計算・モデル構築・学習などを行うフレームワークです。

つまり、この2つはかなり近いレイヤーにあり、「どちらを使うか」を比較する関係です。

一方、Kerasは少し立ち位置が異なります。

Kerasは、Deep Learningのモデルをより簡潔に記述するための高レベルAPIです。

ただ、こうした説明だけでは、

「じゃあ、実際のコードでは何が違うの?」

という疑問が残ります。

そこでこの記事では、実際にDeep Learningを勉強しているエンジニアの視点から、NumPy・TensorFlow・Keras・PyTorchを実際のコードと比較しながら、それぞれの役割と違いを整理します。

単に「Kerasは高レベルAPI、PyTorchはフレームワーク」と説明するだけではありません。

「NumPyで自分で書いていた処理を、TensorFlowやPyTorchではどうするのか?」
「Kerasを使うと、どこまで簡単になるのか?」
「PyTorchでは、なぜモデルや学習ループを自分で書くことが多いのか?」

という視点から見ていきます。

この記事では、実際にDeep Learningを勉強してきたエンジニアが、それぞれのフレームワークを触ってみて「何が分かりやすかったのか」「どこが分かりにくかったのか」も含めて整理します。

この記事はこんな人におすすめ

  • TensorFlow・Keras・PyTorchの違いがよく分からない人
  • これからDeep Learningを勉強しようとしている人
  • NumPyでDeep Learningの基本を勉強した後、次に何を学べばいいか迷っている人
  • PyTorchの研究コードを読めるようになりたい人

この記事を読み終えるころには、

「TensorFlowとPyTorchは何が違うのか?」
「Kerasはどこに位置するのか?」
「自分は何から勉強すればいいのか?」

が整理できるようになるはずです。

1.結論:TensorFlow・Keras・PyTorchは何が違う?

まず、この記事の結論から整理します。

3つの関係をざっくり整理すると、次のようになります。

名前 ざっくり説明 立ち位置
TensorFlow Deep Learningの計算・モデル構築・学習などを行うフレームワーク フレームワーク
PyTorch Deep Learningの計算・モデル構築・学習などを行うフレームワーク フレームワーク
Keras Deep Learningのモデルを簡単に記述するための高レベルAPI 高レベルAPI

ここで最も重要なのは、

TensorFlowとPyTorchは、どちらも同じ「Deep Learningフレームワーク」という近いレイヤーにある

ということです。

どちらも、

  • テンソル計算
  • GPUなどを利用した計算
  • 自動微分
  • ニューラルネットワークの構築
  • 学習
  • 最適化

などを扱えます。

一方、Kerasは少し違います。

Kerasはモデルやレイヤーなどを使って、Deep Learningの処理をより簡潔に記述できるAPIです。

そして現在のKeras 3は、TensorFlowだけでなくPyTorchやJAXもバックエンドとして利用できます。

そのため、かなり大雑把に整理すると、

TensorFlowとPyTorch:Deep Learningを扱うためのフレームワーク
Keras:Deep Learningのモデルや処理を簡潔に記述するための高レベルAPI

と考えると分かりやすいでしょう。

では、そもそもDeep Learningのコードでは、どのような処理をしているのでしょうか?

2.そもそもDeep Learningのコードでは何をしている?

Deep Learningのコードは、いったい何をしているのでしょうか?

例えば、画像を入力して「猫」か「犬」かを判定するニューラルネットワークを考えてみます。

内部では、大まかに次のような処理を行っています。

入力 → ニューラルネットワーク → 出力 → 損失計算 → パラメータ更新

もう少し具体的にすると、

  1. データを入力する
  2. ニューラルネットワークで順方向に計算する
  3. 正解との差を計算する
  4. 誤差逆伝播によって勾配を計算する
  5. 勾配を使ってパラメータを更新する
  6. これを何度も繰り返す

という処理です。

ここで重要なのは、

TensorFlowやPyTorchが登場する前から、ニューラルネットワークの基本的な計算そのものが存在していた

ということです。

つまり、TensorFlowやPyTorchは「Deep Learningそのもの」ではありません。

Deep Learningに必要な計算や学習を、効率よく実装・実行するための仕組み

と考えると分かりやすくなります。

そこでまずは、NumPyだけを使ってニューラルネットワークを実装することを考えてみます。

3.NumPyでニューラルネットワークを実装するとどうなる?

Deep Learningの仕組みを理解するうえで、NumPyによる実装は非常に分かりやすい方法です。

例えば、全結合層では、

$$\boldsymbol{y} = W \boldsymbol{x} + \boldsymbol{b}$$

という計算を行います。

NumPyなら、かなり直接的に書けます。

y = np.dot(x, W) + b

ここでは、

  • \(x\):入力
  • \(W\):重み
  • \(b\):バイアス
  • \(y\):出力

です。

さらに活性化関数を通して、損失を計算します。

そして学習では、

予測

損失計算

勾配計算

パラメータ更新

という処理を繰り返します。

つまり、NumPyだけで実装すると、

ニューラルネットワークの学習で何が起きているのかを、自分でかなり明示的に書く

ことになります。

これはDeep Learningの仕組みを理解するには非常に良い方法です。

一方で、モデルが複雑になると大変です。

例えば、

  • 行列演算
  • 活性化関数
  • 損失関数
  • 微分
  • 誤差逆伝播
  • パラメータ更新

などを自分で考える必要があります。

特に大きなニューラルネットワークになると、勾配計算をすべて手作業で実装するのは現実的ではありません。

そこで登場するのがTensorFlowやPyTorchです。

4.TensorFlowとは?

TensorFlowは、Googleが開発した機械学習・Deep Learning向けのフレームワークです。

NumPyでは自分で書いていた、

  • テンソル計算
  • 自動微分
  • GPUなどを利用した計算
  • ニューラルネットワークの構築
  • 学習処理
  • 最適化

などを扱うための仕組みが用意されています。

特に重要なのが自動微分です。

NumPyだけでニューラルネットワークを実装すると、勾配計算も自分で実装する必要があります。

一方、TensorFlowには自動微分の仕組みがあり、例えばtf.GradientTapeを使って勾配を自動的に計算できます。

たとえば、次のようなコードで実装できます。


for x, y in dataset:
    with tf.GradientTape() as tape:
        predictions = model(x)
        loss = loss_object(y, predictions)
    
    gradients = tape.gradient(loss, model.trainable_variables)
    optimizer.apply_gradients(zip(gradients, model.trainable_variables))

つまり、

「この計算結果をもとに、各パラメータをどの方向にどれくらい変えればいいのか?」

という部分をフレームワークに任せられます。

このように、TensorFlowはNumPyで自分が実装していた処理を、Deep Learning向けの機能を備えた形で扱えるようにしたもの、と考えるとイメージしやすいでしょう。

5.Kerasとは?

ここでKerasが登場します。

Kerasは、Deep Learningのモデルをより簡単に記述するための高レベルAPIです。

例えば、ニューラルネットワークを作る場合、

model = keras.Sequential([
    keras.layers.Dense(128, activation="relu"),
    keras.layers.Dense(10, activation="softmax")
])

のように、かなり少ないコードでモデルを定義できます。

NumPyで考えると、

入力

行列演算

活性化関数

行列演算

活性化関数

出力

という処理を自分で考えていました。

Kerasでは、

Dense

Dense

のように、ニューラルネットワークの構造そのものを記述する感覚に近づきます。

さらに、

model.compile(...)
model.fit(...)

と書くことで、損失関数や最適化手法を指定し、学習まで実行できます。

Kerasは、

Deep Learningでよく使う処理を、分かりやすいインターフェースにまとめてくれている

と考えるとよいでしょう。

なお、Kerasについて注意したいのが、現在のKeras 3はTensorFlow専用ではないということです。

Keras 3は、TensorFlow・PyTorch・JAXをバックエンドとして利用できます。

そのため、

「Keras=TensorFlow」

と覚えるより、

「Kerasという高レベルAPIがあり、その下でTensorFlowやPyTorch、JAXなどを利用できる」

と理解しておくほうが、現在のKerasを正しく捉えられます。

6.PyTorchとは?

PyTorchもDeep Learningのための代表的なフレームワークです。

TensorFlowと同じように、

  • テンソル計算
  • 自動微分
  • GPUなどを利用した計算
  • ニューラルネットワークの構築
  • 学習処理
  • 最適化

などを扱えます。

つまり、TensorFlowとPyTorchはかなり近い位置にあります。

実際、PyTorchにも自動微分の仕組みであるtorch.autogradがあり、ニューラルネットワークの学習に必要な勾配を自動的に計算できます。

では、実際にコードを書いたときには、Kerasとどのような違いがあるのでしょうか?

PyTorchでは、ニューラルネットワークを、

class MyModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(784, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = self.fc1(x)
        x = torch.relu(x)
        x = self.fc2(x)
        return x

のように定義できます。

ここで重要なのが、

def forward(self, x):

です。

PyTorchでは、モデルが入力を受け取って、どのような計算をするのかをコードとして明示的に記述できます。

さらに、学習処理も自分で書くことができます。

この「自分で処理の流れを記述しやすい」という点は、PyTorchを理解するうえで重要なポイントです。

7.TensorFlowとPyTorchは結局、何が違う?

ここまで来ると、最初の疑問に戻ります。

TensorFlowとPyTorchは、結局同じようなものなのでしょうか?

答えは、

「同じではないが、かなり近いことをするフレームワーク」

です。

どちらもDeep Learningに必要な、

  • テンソル計算
  • 自動微分
  • ニューラルネットワーク
  • GPU計算
  • 学習
  • 最適化

などを扱います。

そのため、「TensorFlowとPyTorchは同じレイヤーにある」と考えて問題ありません。

一方で、APIの設計思想や周辺エコシステム、コードの書き方などには違いがあります。

特に私がPyTorchを触っていて分かりやすいと感じたのが、Pythonコードとしてモデルの処理や学習ループを明示的に書きやすい点です。

例えば、nn.Moduleでモデルを定義し、forward()で順方向の処理を書き、loss.backward()で逆伝播、optimizer.step()でパラメータを更新する、という流れがコードから追いやすくなっています。

一方、TensorFlowにはTensorFlow独自の計算・実行・分散処理・モデルの保存や展開などを含む広いエコシステムがあります。

とはいえ、

「TensorFlowは実運用、PyTorchは研究」

のように完全に分けてしまうのはおすすめしません。

どちらも研究・開発・実運用に利用できます。

ただし、これからAI関連の論文を読んだり、最新のモデルを実装したりするのであれば、PyTorchのコードを読めることは大きなメリットになります。

8.NumPy・TensorFlow・Keras・PyTorchの違いを整理

ここまでの話を一度整理します。

NumPy TensorFlow Keras PyTorch
立ち位置 数値計算ライブラリ DLフレームワーク 高レベルAPI DLフレームワーク
テンソル計算 自分で実装 バックエンドを利用
自動微分 自分で実装 バックエンドを利用
モデル構築 自分で実装
学習処理 自分で実装
コードの簡潔さ
処理の自由度

この表からも分かるように、KerasはTensorFlowやPyTorchと完全に同じ立ち位置ではありません。

Kerasは、Deep Learningの処理をより簡潔に記述するためのAPIです。

そして現在のKeras 3では、TensorFlowだけでなくPyTorchやJAXをバックエンドとして利用できます。

9.実際に同じニューラルネットワークを作ってみる

ここでは、同じニューラルネットワークをKerasとPyTorchで作ってみます。

例えば、

入力:784

全結合層:128

ReLU

全結合層:10

出力

という単純なモデルです。

Kerasの場合

Kerasでは、モデルの構造をかなり簡潔に記述できます。

model = keras.Sequential([
    keras.layers.Dense(128, activation="relu"),
    keras.layers.Dense(10)
])

さらに、

model.compile(...)
model.fit(...)

とすることで、学習まで実行できます。

このコードからは、

「784次元の入力を受け取り、128個のニューロンを持つ層を通して、10クラスに分類するモデル」

という構造が比較的簡単に読み取れます。

PyTorchの場合

PyTorchでは、モデルをクラスとして定義します。

class MyModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(784, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

Kerasよりも記述量は増えます。

その代わり、

「モデルがどのような計算を行うのか」

をコードから明示的に確認できます。

この違いは、単純なモデルでは小さく見えます。

しかし、モデルが複雑になったり、特殊な処理を追加したりすると、

「どこまでをフレームワークに任せ、どこからを自分で実装するのか」

という違いが見えてきます。

10.TensorFlow/KerasとPyTorchでは「学習の流れ」がどう違って見える?

ここが、実際に触ってみると特に面白いところでした。

Kerasでは、

model.fit(...)

と書けば、学習処理をかなりまとめて実行できます。

そのため、

「どんなモデルを作って、何を学習させるか」

という部分に意識を向けやすくなります。

一方、PyTorchでは、

for epoch in ...:
    for x, y in dataloader:
        optimizer.zero_grad()
        output = model(x)
        loss = criterion(output, y)
        loss.backward()
        optimizer.step()

のように、学習ループを明示的に書くことができます。

すると、

データを取得

勾配を初期化

モデルにデータを入力

損失を計算

逆伝播

パラメータ更新

というDeep Learningの学習の流れが、コードそのものから見えてきます。

もちろん、Kerasでもカスタム学習ループを記述できます。

そのため、

「Kerasでは学習ループを書けない」

という意味ではありません。

あくまで、

Kerasでは一般的な学習処理を簡潔に書きやすく、PyTorchでは学習処理を自分で記述するスタイルが分かりやすい

という違いです。

11.結局どれを使えばいい?

ここまで見てきた内容から、目的別に考えてみます。

Deep Learningの仕組みを理解したい

まずはNumPyがおすすめです。

NumPyでニューラルネットワークを実装してみると、

  • 順伝播
  • 損失計算
  • 誤差逆伝播
  • 勾配計算
  • パラメータ更新

という処理が見えてきます。

これを理解しておくと、その後にTensorFlowやPyTorchを使ったとき、

「この処理をフレームワークが自動でやってくれているんだな」

と理解しやすくなります。

Deep Learningのモデルを簡単に作ってみたい

Kerasが向いています。

少ないコードでモデルを作り、学習・評価まで進められるため、Deep Learningの全体像を体験しやすいからです。

特に「まずは自分でモデルを作って動かしてみたい」という段階では、Kerasのシンプルさは大きなメリットだと思います。

最新の論文や研究コードを読んで実装したい

PyTorchを優先して勉強する価値があります。

特に研究・論文実装では、PyTorchで書かれたコードに触れる機会が多いためです。

モデルの定義だけでなく、forward()や学習ループまで読めるようになると、

「論文に書かれているモデルが、実際のコードではどう実装されているのか」

を理解しやすくなります。

既存のTensorFlow環境やTensorFlowのエコシステムを利用したい

TensorFlow / Kerasを学ぶ価値があります。

すでにTensorFlowを利用しているプロジェクトに参加する場合などは、TensorFlowを学ぶことがそのまま実務上のメリットになります。

では、TensorFlowは勉強しなくてもいい?

ここは少し注意が必要です。

「最新の研究コードを読むならPyTorchだから、TensorFlowは必要ない」と単純に考える必要はありません。

TensorFlowとPyTorchは、どちらもDeep Learningを扱うための主要なフレームワークです。

重要なのは、

TensorFlowとPyTorchのどちらが優れているかではなく、自分が何をしたいのかで選ぶ

ということです。

12.これからDeep Learningを勉強するなら?

私自身、Deep Learningを勉強してみて感じたのは、

「フレームワークを覚えること」と「Deep Learningを理解すること」は別物

ということです。

Kerasを使えば、数十行程度でニューラルネットワークを作れます。

しかし、それだけでは、

「なぜ学習できるのか?」
「fit()の中で何が起きているのか?」

までは分かりません。

逆に、NumPyでニューラルネットワークを実装してみると、

順伝播

損失

微分

誤差逆伝播

勾配

パラメータ更新

というDeep Learningの基本構造が見えてきます。

そのうえでKerasやPyTorchを見ると、

「自分で書いていた処理を、ここではフレームワークに任せているのか」

と理解できるようになります。

そのため、これからDeep Learningを勉強するなら、個人的には、

NumPyで仕組みを理解する

Kerasでモデルを簡単に作ってみる

PyTorchでモデルや学習ループを自分で書いてみる

必要に応じてTensorFlowも学ぶ

という順番がおすすめです。

ただし、これは「この順番でなければならない」という意味ではありません。

研究を目的にするなら、最初からPyTorchを使ってもいいでしょう。

すでにTensorFlowを使っているプロジェクトに参加するなら、TensorFlowから勉強するほうが効率的です。

大切なのは、

フレームワークの使い方を覚えるだけでなく、その裏側で何が起きているのかを理解すること

だと思います。

まとめ

TensorFlow、Keras、PyTorchは、どれもDeep Learningで使われる技術ですが、同じ種類のものではありません。

特に重要なのは、

  • TensorFlow:Deep Learningの計算・モデル構築・学習などを行うフレームワーク
  • PyTorch:Deep Learningの計算・モデル構築・学習などを行うフレームワーク
  • Keras:Deep Learningのモデルを簡単に記述するための高レベルAPI

という関係です。

TensorFlowとPyTorchは同じ「フレームワーク」というレイヤーにあり、どちらもDeep Learningに必要な計算や学習を扱えます。

一方、KerasはDeep Learningのモデルをより簡潔に記述するためのAPIです。

そして現在のKeras 3では、TensorFlowだけでなくPyTorchやJAXをバックエンドとして利用できます。

実際にコードを書いて比較すると、

NumPy → 「Deep Learningで何を計算しているのか」
TensorFlow / PyTorch → 「Deep Learningに必要な処理をどう実行するのか」
Keras → 「その処理をどのように簡潔に記述するのか」

という違いが見えてきます。

「TensorFlowとPyTorch、どっちが優れている?」

と考えるよりも、

「自分はDeep Learningで何をしたいのか?」

と考えることが大切です。

Deep Learningの仕組みを理解したいならNumPy。
モデルを簡単に作ってみたいならKeras。
最新の論文や研究コードを読みたいならPyTorch。
既存のTensorFlow環境やエコシステムを利用するならTensorFlow。

そして、どのフレームワークを使う場合でも、その裏側にある

「入力 → 順伝播 → 損失計算 → 誤差逆伝播 → パラメータ更新」

というDeep Learningの基本的な流れを理解しておくと、フレームワークが変わっても学んだ知識を応用できます。

私自身、Deep Learningを勉強してきて、最初は「TensorFlow、Keras、PyTorchって何が違うんだ?」と感じていました。

しかし、実際にNumPy、Keras、PyTorchで同じようなモデルを作って比較してみると、

「何を自分で書いて、何をフレームワークに任せているのか」

が少しずつ見えてきました。

この記事が、TensorFlow・Keras・PyTorchの違いを整理し、これからDeep Learningを学ぶときの「次に何を勉強すればいいのか」を考えるきっかけになればと思います。

関連書籍

今回の記事では、TensorFlow・Keras・PyTorchの違いを中心に整理しました。

ただ、実際にDeep Learningのモデルを作れるようになるためには、フレームワークの使い方だけでなく、画像認識や時系列データなど、具体的な問題に対してモデルをどう組み立てるのかを学ぶ必要があります。

そこで、今回の記事の内容をさらに実際のコードで学びたい人向けに、私が読んだ本を紹介します。

『物体・画像認識と時系列データ処理入門』

TensorFlow、Keras、PyTorchを使って、画像認識や時系列データ処理を実際に実装しながら学びたい人に向いている本です。

今回の記事で、

「TensorFlow・Keras・PyTorchの違いは分かったけど、実際にコードを書いてみたい」

と思った人は、次のステップとして読んでみるとよいでしょう。

Amazon.co.jp
AI
toshi

京都市在住。エンジニアの仕事をしながら、趣味の読書が高じてブログ運営を開始。これまで600冊以上の本の感想をアップしています。現在も、子どもたちと一緒に読書三昧の日々を過ごしています。

toshiをフォローする
シェアする
toshiをフォローする

コメント

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