想定読者
- Tensorflow 2の環境で1系のコードで書かれたCNN(畳み込みNN)を動かそうと試行錯誤している人
前提
実行環境
- macOS High Sierra
- Python 3.7.8
- Tensorflow 2.3.1
CNNのコードについて
コードは諸事情により載せませんが、
- MNISTのデータ取得に
tf.keras.*
を使用 - その他
tf.nn.*
,tf.train.*
,tf.*
を使用
して、CNNを実行しているコードです。
1系から2系への主な変更点
Tensorflow 1から2への主な変更点については、 こちら 等いろいろな記事を拝見しましたが、CNNを実行する上で直接影響のあったものは以下でした。
- Eager Executionのデフォルト化
- Session, Placeholderの廃止
※ CNNの実装方法によっては他にもあるかもしれませんがその点はご容赦ください。
1系記法のコードを2系で動かす方法
1系記法のCNNを2系で動かす(ためにコードを変更する)方法は以下の3つがあるようです。
- 変更のあったAPIを地道に書き換える
- アップデートスクリプトを活用する
- 2系挙動を無効化する
1. 変更のあったAPIを地道に書き換える
賢い方法ではありませんが、変更箇所が少なければ該当箇所を地道に書き換えるというのもなくはないかと思います。CNNを動かすために要した修正を以下に示します。
(1) Eager Executionの無効化
import tensorflow as tf
の直後に以下を追記し、Eager Executionを無効化する。
tf.compat.v1.disable_eager_execution()
(2) いくつかのAPIの記法変更
コード内の '1系' の列に該当するAPIを '2系' にある記載の通りに変更する。
# | 1系 | 2系 |
---|---|---|
1 | tf.placeholder | tf **.compat.v1.**placeholder |
2 | tf.random_uniform | tf.random.uniform |
3 | tf.add_to_collection | tf **.compat.v1.**add_to_collection |
4 | tf.get_collection('costs') | tf **.compat.v1.**get_collection |
5 | tf.train.AdamOptimizer | tf **.compat.v1.**train.AdamOptimizer |
6 | tf.Session() | tf **.compat.v1.**Session() |
#2のような単純に compat.v1
を追加ではないものもありました。
上記以外で compat.v1
の追加が必要なAPIについては、Tensorflow Module: tf.compat.v1をご参照ください。
2. アップデートスクリプトを活用する
コードをTensorFlow 2に自動的にアップグレードするを参考に、アップデートスクリプトを用いて、コードを2系記法に変換する方法もあるようです。1の手動変換よりは安全かと思いますが、一部手動変換を要する箇所もあるような記述もあり、全自動ではなさそうです。
3. 2系挙動を無効化する
TensorFlow1コードをTensorFlow2に移行しますによると、
Tensorflowのインポート文
import tensorflow as tf
を
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
のように変更して2系挙動を無効化することで、1系記法のコードが実行できるようになるようです。(私のコードでは実行が確認できました)
終わりに
3の方法で動いたら一番嬉しいですね。
私は1をした後に3の方法を見つけたのでそういう人が出ないようにこれを書きました。
どんどんTensorflowに慣れていきたいものです。