TensorFlow

【TensorFlow】深層学習ライブラリ TensorFlow、Kerasの概要

【TensorFlow】深層学習ライブラリ TensorFlow、Kerasの概要

Pythonでディープラーニングを実装する際に使用できる深層学習ライブラリTensorFlowKerasの概要について解説します。

深層学習ライブラリ

ディープラーニングをPythonで実装する際に、使用されるライブラリを深層学習ライブラリと言います。ここで深層学習ライブラリという言葉は「フレームワーク」と呼ばれるモジュール群やフレームワークを使用するための「高水準API」をまとめて使われます。

有名どころでいうとTensorFlowKerasPytorchといったものがあります。

一番ユーザー数が多いライブラリはTensorflow、Kerasと言われています。また、近年ではPytorchが研究者などにとても人気があるライブラリで、最新の研究のプログラムはPytorchで実装されていたりします。ちなみに、ディープラーニングではない機械学習ライブラリとして有名なものとしてはscikit-learnがあります。

本記事では、ディープラーニングライブラリの中からTensorflow、Kerasについてそれぞれ概要と関係性について説明します。

TensorFlow、Kerasの概要

TensorFlowとは

TensorFlowは、Googleによって開発されているPythonベースのオープンソース機械学習ライブラリです。機械学習と言えば、まずNumPyという感じがしますが、TensorFlowはNumPyを超える機能を持っています。例えば以下のような項目です。

  • 微分可能な式の勾配を自動的に計算できる(GradientTape)
  • CPUだけではなくGPUやTPUを用いた実行ができるため、ディープラーニングに適したハードウェアの活用ができる
  • 複数マシンでの分散実行にも適している

TensoFlowは、非常に広いコンポーネントの集まりで、Googleが開発しているものだけではなく、サードパーティが開発したものも多く存在しています。そのため、様々な利用シーンをカバーしたものとなっています。

Kerasとは

Kerasは、TensorFlowのフレームワークをベースにして構築されている高水準APIです。ここで高水準APIと言っているのはイメージとしては以下のようなイメージで、PythonプログラムとTensorFlowの間をつなぐような役割をします。

KerasとTensorFlowの関係性

Kerasは、人間にも分かりやすいシンプルなディープラーニングワークフローとしてAPIを提供してくれています。イメージとしてはTensorFlowだけでプログラミングをするよりも、Kerasを用いることで非常に少ないステップで実装できると思ってもらえればよいかと思います。

例えば、MNIST(エムニスト)という手書き数字のデータセットを使用して、手書き数字を分類するプログラム実装を考えてみます。実装方法は色々考えられますが、1例として以下のように実装することができます。

import numpy as np
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.datasets import mnist


def main():
    # ===== MNISTデータを読み込み&正規化
    (train_imgs, train_labels), (test_imgs, test_labels) = mnist.load_data()
    train_imgs = train_imgs.reshape((60000, 28 * 28)).astype("float32") / 255
    test_imgs = test_imgs.reshape((10000, 28 * 28)).astype("float32") / 255
    # 訓練データの一部(20%)を評価データとして使う
    idx = int(train_imgs.shape[0] * 0.2)
    train_imgs, val_imgs = train_imgs[idx:], train_imgs[:idx]
    train_labels, val_labels = train_labels[idx:], train_labels[:idx]

    # ===== モデルを構築する(Sequentialモデルを使用)
    model = keras.Sequential(
        [
            keras.Input(shape=(28 * 28,)),
            layers.Dense(256, activation="relu"),
            layers.Dropout(0.5),
            layers.Dense(10, activation="softmax"),
        ]
    )

    # ===== optimizer、損失関数、指標を指定してコンパイル
    model.compile(
        optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"]
    )

    # ===== fitを使ったモデルの訓練
    history = model.fit(
        train_imgs, train_labels, epochs=5, validation_data=(val_imgs, val_labels)
    )

    # ===== evaluateを使ったテストデータでの評価
    result = model.evaluate(test_imgs, test_labels)
    print(result)

    # ===== predictを使って予測結果を表示
    preds = model.predict(test_imgs)
    print(f"予測: {np.argmax(preds[0])}, 正解: {test_labels[0]}")


if __name__ == "__main__":
    main()
【実行結果例】
Epoch 1/5
1500/1500 [==============================] - 6s 3ms/step - loss: 0.3504 - accuracy: 0.8954 - val_loss: 0.1615 - val_accuracy: 0.9535
Epoch 2/5
1500/1500 [==============================] - 5s 3ms/step - loss: 0.1805 - accuracy: 0.9450 - val_loss: 0.1184 - val_accuracy: 0.9654
Epoch 3/5
1500/1500 [==============================] - 5s 3ms/step - loss: 0.1427 - accuracy: 0.9572 - val_loss: 0.0980 - val_accuracy: 0.9716
Epoch 4/5
1500/1500 [==============================] - 5s 3ms/step - loss: 0.1234 - accuracy: 0.9616 - val_loss: 0.0927 - val_accuracy: 0.9720
Epoch 5/5
1500/1500 [==============================] - 5s 3ms/step - loss: 0.1076 - accuracy: 0.9667 - val_loss: 0.0895 - val_accuracy: 0.9737
313/313 [==============================] - 1s 2ms/step - loss: 0.0809 - accuracy: 0.9734
[0.08085151016712189, 0.9733999967575073]
313/313 [==============================] - 0s 1ms/step
予測: 7, 正解: 7

上記のプログラムでは、MNISTという手書き数字画像のデータセットからディープラーニングモデルを構築し、テスト用画像データに対して予測をする例となっています。最後の予測結果を見てみると「7」が正解ラベルの画像に対して「7」と予測できていることが分かります。

上記プログラムについては、大まかに以下のような流れで実装がされています。この流れは、ディープラーニングのプログラム実装で一般的な処理の流れとなっています。

  1. モデルを構築する(上記例ではSequentialモデルを使用)
  2. compileで、オプティマイザ、損失関数、監視する指標を指定してコンパイル
  3. fitを使ったモデルの訓練(学習)
  4. evaluateを使ったモデルの評価
  5. predictを使った予測

詳細なコードの説明は割愛しますが、ここでは、手書きの数字を分類するプログラムがたったこれだけのステップ数で書けるのはすごいことであることを感じてもらえればよいかなと思います。

上記のモデル構築方法はSequential APIを使った最もシンプルに記載できる方法ですが、Kerasでは、Functional APIやSubclassing APIといったモデル構築方法もあり、より柔軟に課題に対応できるようになっています。各APIについては「Keras APIでモデルを構築する色々な方法と違い(Sequential API, Functional API, Subclassing API)」にて説明していますので、興味があれば参考にしてください。

TensorFlowとKerasの関係性

Kerasは2015年3月にリリースがされていて、TensorFlowは2015年11月にリリースされています。上記の説明でKerasはTensorFlowの高水準APIと言っている点で時系列がずれていると気づかれた方も多いかと思います。

Kerasは当初TheanoというライブラリをベースにしたAPIとして開発がされていました。TensorFlowがリリースされたのちにKerasからTensorFlowを使用できるようにリファクタリングされて、KerasからはTheanoとTensorFlowの使い分け(切り替え)ができるようになりました。2016年にはデフォルトがTensorFlowに切り替わっています。

Kerasは、各種フレームワークの高水準APIという位置づけのライブラリのため、その他にもCNTK(Microsoftが開発)、MXNet(Amazonが開発)なども使用できるようになりましたが、現在Kerasは、TensorFlowのみがバックエンドのフレームワークとなっています。

その後、2018年にはKerasはTensorFlowのAPIとして正式に採用される形となり、2019年にリリースされたTensorFlow 2.0からは、TensorFlowのAPIとして中心に位置づけられています。なお、TensorflowのラッパープログラムとしてのKeras開発は、2020/5/9に事実上の開発終了となっています。

まとめ

深層学習ライブラリとして、TensorFlowとその高水準APIであるKerasについて紹介してきました。

TensorFlowはGoogleが開発したディープラーニングのためのフレームワークで、テンソル関係の操作や勾配の自動計算などディープラーニング実装で必要となる機能や、他にも幅広いコンポーネントを提供してくれています。

Kerasは、TensorFlowの高水準APIでディープラーニングのワークフローを簡単に実装するためのAPIが提供されています。

TensorFlow、Kerasは世界で最も利用されている深層学習ライブラリですので、是非学習してみてもらいたいと思います。