Tensorflow 2.X でTensorflow 1.Xで書かれたコードを動かす方法
前回Tensorflowの使い方について記事にしました。
しかし、よく調べてみると、この記事で書いたことはTensorflow 1.Xについての話で、Tensorflow 2.Xでは考え方が変わっていることが分かりました。
具体的にはTensorflow 1.XはDefine and Run(グラフを定義した後にまとめて実行)だったのに対し、Tensorflow 2.XはDefine by Run(グラフの構築とデータを渡して実行するのを同時に行う)になっています。Define by RunはEager Executionとも言うそうです。
例えば、Tensorflow 1.Xで使われていたPlaceholderはTensorflow 2.Xではなくなっており、定義するとエラーとなります。また、計算実行時に使っていたSessionも使う必要がなくなっています。
となると、疑問が湧きます。
Tensorflowのバージョンを2.Xに上げた後に、1.Xで書かれたコードを実行したいときはどうすればいいのか?
これについて調べてみたので、備忘録として書いておきます。
Tensorflow 1系で動かすには?
結論としては import tensorflow as tfとしているところを以下のように置き換えればOKです。
import tensorflow.compat.v1 as tf tf.disable_v2_behavior()
他のpythonスクリプトをimportしている場合はそちらでもtensorflowをimportしている場合があるため、すべてこのように修正してください。
Kerasの場合は?
Tensorflow2.XではKerasはTensorflowの高レベルAPIとして組み込まれており、スタンドアローンとして使用する(import Keras)使い方だとエラーが発生しました。
以下はエラーの一例
RuntimeError: It looks like you are trying to use a version of multi-backend Keras that does not support TensorFlow 2.0. We recommend using `tf.keras`,
or alternatively, downgrading to TensorFlow 1.14.
TensorflowのAPIとしてKerasを使用するには以下のようにします。
from tensorflow import keras
from tensorflow.keras import ***
高レベルAPIとしての使い方であればTensorflow1.X, 2.Xともに同じ記述で動くとのことです。もしTensorflow 2系でKerasを動かしたときにエラーがでればスタンドアローンKerasを使っていないか確認してみてください。スタンドアローンとTensorflowのAPIで関数名が若干変わっているものがあるようです。
まとめ
Tensorflow1系で書かれたコードをTensorflow2系で動かすための方法を記載しました。もし同じことで悩んだ方がおられたときに助けになれば幸いです。