TensorFlow+Kerasの最新情報として、Keras 3.0のリリースに伴い、TensorFlowから独立し、TensorFlow 2.16以降でKeras 3がデフォルトとなったことについて紹介します。また、Keras 3(TensorFlowバックエンド)での書き方や、今後のディープラーニングライブラリの選び方についても私見を示します。
もう4年も前になりますが、2020年5月に「マルチバックエンドKerasの終焉(しゅうえん)、tf.kerasに一本化」という記事を書きました。しかしその後、逆の動きが起きています。本稿では、前回の記事をフォローアップする目的も兼ねて、最新の状況をお伝えします。
そもそもKerasとは、もともと他のフレームワークをバックエンドとして選択し、より簡単にコードを書くためのディープラーニングライブラリの一つでした。当時はTensorFlowやTheano、CNTKといった複数のフレームワークを選択できたため、マルチバックエンドと呼ばれていました。それが2020年5月、そのマルチバックエンドを取りやめ、TensorFlow標準の高水準API(通称:tf.keras)としてTensorFlowの中に完全に取り込まれました。
それから3年後の2023年11月28日、Keras 3.0がリリースされました。このバージョンでは、オープンソースであるKerasのGitHubリポジトリが、TensorFlowに同梱版の「GitHub:keras-team/tf-keras」(2019〜2023年)から、独立版の「GitHub:keras-team/keras」に変更されています。
TensorFlowから独立したおかげで、Keras 3ではマルチバックエンド機能が復活しました。バックエンドの選択肢も、JAX、TensorFlow、PyTorchという最新のディープラーニングライブラリが利用可能になっています。
最初に挙げられているJAXは、NumPyライクの高速なライブラリで、Google DeepMindで使われていることで有名です。JAXは、低レベルで細かい実装が可能なため、研究者向きです。最近のGoogleの研究では、このライブラリが多く使われていると予想されます。
次に挙がっているTensorFlowバックエンドにより、既存のtf.kerasユーザーは引き続き、高水準APIとしてKerasを利用できます。TensorFlowは研究分野ではPyTorchにシェアを奪われていますが、TensorFlow Liteを使うエッジデバイス向けなどのビジネス現場では依然として採用されており、AIの開発というよりも運用の面で生き残っていく可能性が高いと筆者は考えています。
最後に挙がっているPyTorchは、人気のディープラーニングライブラリもカバーしておきたいということでしょう。とはいえ、PyTorchにもSequentialクラスを使って、Kerasで特徴的だったSequential(積層型)モデルの書き方と同じように書けます。よって、Keras経由でPyTorchを使うメリットはそこまで高くないだろう、というのが筆者の感想です。
筆者の意見としては、新しいKeras 3以降を使いたい場合、スピードを優先するならJAXバックエンドを、安定性を優先するならTensorFlowバックエンドを選択するとよいでしょう。
さらにそれから約4カ月後の2024年3月8日、Keras 3をデフォルトの高水準APIとしたTensorFlow 2.16がリリースされました。このタイミングで、TensorFlowにはtf.kerasが同梱されなくなりました。
代わりに、TensorFlowの依存パッケージとして、TensorFlowのインストールと同時にKeras 3がインストールされるようになっています。つまり、同梱されていなくても、KerasがTensorFlow標準の高水準APIであり続けることは変わりません。
もちろん、tf.keras(Keras 2)を使い続ける必要がある人のための救済措置も用意されています。具体的には、pip install tf-keras~=2.16というシェルコマンドで、tf.kerasをインストールできます。また、環境変数としてTF_USE_LEGACY_KERAS=1を指定することで、Keras 3の代わりにKeras 2(従来のtf.keras)が使われるように切り替わります。
ちなみに、こうした救済措置があるので、本稿のタイトルにある「終了」は言い過ぎかもしれません。ただし、長期的に見てお勧めできる使い方ではないので、「終了」という強い言葉で周知することにしました。
以前のtf.kerasでは、リスト1のようにTensorFlowをインポートしたら、すぐにtf.keras.……といったコードを書くのが一般的でした。
import tensorflow as tf
model = tf.keras.models.Sequential()
このtf.keras.……という書き方は、TensorFlow 2.16以降でも有効であるため、既存のコードを修正する必要はありません。また、import tensorflow.keras as kerasという書き方も同様に有効です。
しかし、KerasがTensorFlowに内包されているわけでもないのに、tf.keras.……やtensorflow.kerasという書き方は不自然ではないでしょうか。よって今後は、リスト2のようにKerasで標準的な書き方に変えていくのが好ましいと思います。
import keras
model = keras.models.Sequential()
ただし、これはあくまで筆者の見解にすぎませんので、その点にご留意ください。執筆時点(2024年5月17日)では公式の「TensorFlow 2チュートリアル」では、リスト1のようなtf.keras.……という書き方のままになっています。
なお、Kerasはマルチバックエンドになっているので、JAX/TensorFlow/PyTorchの複数をインストール済みの場合は、リスト2のコードを書く前に、環境変数としてKERAS_BACKEND="tensorflow"(もしくは"jax"か"torch")を指定する必要があります。または、ローカル環境の構成ファイル(~/.keras/keras.json)に一括で指定することもできます。リスト3のようにPythonコードで事前に環境変数をセットしてもOKです。
import os
os.environ["KERAS_BACKEND"] = 'tensorflow'
print(keras.backend.backend())
# 出力例: 'tensorflow'
以上が今回お伝えしておきたかった内容です。最後に、Keras 3やディープラーニングのライブラリについて、私なりの意見や感想を書いておきます。
本稿の連載名として記載している『TensorFlow 2+Keras(tf.keras)入門』という表現は、もはや古くなってしまいました。なので、『Keras 3(TensorFlowバックエンド)入門』という連載名に変えて、各回のコードもimport tensorflow as tf; tf.kerasからimport kerasに変えていく必要性を感じています。その作業量は多くなりそうなので、すぐにはできませんが、いずれ修正していくつもりです。
この例からも分かるように、TensorFlowとKerasは、大きな全体方針を頻繁に変更しており、ユーザーからすると「付いていけない」と感じることが多いです。Kerasの今回の変更も、新規ユーザーの取り込み以上に、「既存ユーザーのKeras離れ」というマイナスの影響を生む可能性があるのではないかと思っています。
また、PyTorchを含めてディープラーニングのライブラリ自体が、最近はあまり話題になっていません。PyTorchには日本で大きなユーザーコミュニティーはついにできなかったと筆者は認識していますし、TensorFlowの日本ユーザーコミュニティーであるTFUG(TensorFlow User Group Tokyo)もコロナ禍以降は活動がありません。生成AIの台頭がそれに追い打ちをかけたと筆者は考えています。このようなユーザーコミュニティーの状況は日本だけでなく、世界全体でも同じです(※筆者調べ)。
さらにTensorFlowには、「TensorFlowデベロッパー認定資格」という資格制度がありましたが、2024年5月ごろ、つまり最近、終了してしまいました。
こういった状況を踏まえると、初心者向けにKerasで学ぶというケースは大いにあり得ると思いますが、Keras 3でユーザーシェアを伸ばすのはかなり難しいと筆者は予想しています。将来性を考えると、ディープラーニングの初心者は『PyTorch入門』(こちらの連載も最新バージョン化を予定)から学び始めるのもよいと思います。最先端の研究者なら、JAXも有力な選択肢だと思います。
Copyright© Digital Advantage Corp. All Rights Reserved.