Pythonでディープラーニングを実装する際に使用できる深層学習ライブラリTensorFlow、Kerasの概要について解説します。
深層学習ライブラリ
ディープラーニングをPythonで実装する際に、使用されるライブラリを深層学習ライブラリと言います。ここで深層学習ライブラリという言葉は「フレームワーク」と呼ばれるモジュール群やフレームワークを使用するための「高水準API」をまとめて使われます。
有名どころでいうとTensorFlow、Keras、Pytorchといったものがあります。
一番ユーザー数が多いライブラリは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は、人間にも分かりやすいシンプルなディープラーニングワークフローとして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」と予測できていることが分かります。
上記プログラムについては、大まかに以下のような流れで実装がされています。この流れは、ディープラーニングのプログラム実装で一般的な処理の流れとなっています。
- モデルを構築する(上記例ではSequentialモデルを使用)
- compileで、オプティマイザ、損失関数、監視する指標を指定してコンパイル
- fitを使ったモデルの訓練(学習)
- evaluateを使ったモデルの評価
- 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は世界で最も利用されている深層学習ライブラリですので、是非学習してみてもらいたいと思います。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。