はじめに
この記事はTensorFlow2.0(以下、TF2.0)のPreview版がPyPIに公開されたことを受け、正式版の公開やその利用に向けて備える記事です。特に、APIの整理に伴って消えたAPIを紹介し、それによってTensorFlowの使い方が大きく変わることの警告を目指します。
また、筆者の属性は、TF歴3年の画像認識屋です。しかし、内容は個人の意見で、別分野の方や別ライブラリユーザーだけでなく、同属性の方からも別の意見が出ると思います。純粋にTF2.0を学びたい方は、他の記事を参考にしてください。
リンク
tf.keras以外の高レベルAPIの消滅
- tf.layers
- tf.contrib.slim
- tf.contrib.layers(slimはtf.contrib.layersを呼んでいる)
これらがいつからあるのか調べてみると、「TensorFlowの増大するAPIについて少し考えてみた」という記事が見つかりました。tf.layersがTF1.0で導入され、slimはそれ以前からあったようです。これらを使っている人は層の記述方法を移行する必要があります。
移行先には次が考えられます。
- tf.keras
- keras(以下、生keras)
- sonnet
しかし、生kerasもsonnetも消える予定のAPIを使って実装している部分がありTF2.0対応が必要です。これまでの方法に近い方法でTF2.0をすぐに使うには、tf.kerasしか無いようです。
自分の場合、tf.contrib.layersからsonnetへ移行を検討して、こういう感じに設計するといいのかななどと考えていました。しかし、TFの変わり具合を見て、tf.kerasに屈するかPyTorchに乗り換えるか、そもそも機械学習プログラミングの設計方針を考え直すか、などと再検討することになりました。
tf.Sessionの消滅
TensorFlowといったらsess.runなイメージですが、tf.Sessionが無くなります。Eagerモードが標準になった影響でしょう。Graphモードも残っていて、そっちはそのままなのだろうと思っていたら、そうではなかったという状況です。
tf.train.XXOptimizerの消滅
これもtf.kerasに統合されます。しかし、その使い方は元のtf.trainのOptimizerのように、train = opt.minimize(loss)
してsess.run(train)
しようにもtf.Sessionがないためできません。
tf.placeholderの消滅
これはEagerモードの影響です。placeholderは
- 計算グラフの入力の型を定義する
- 入力のノードをオブジェクトとして扱う
というものでした。しかし、前者の目的はtf.TensorSpecと重複し、そもそも後者は、入力の値自体と重複して二度手間なコードを書かないといけない部分でした。そう考えると消えるのが理解できます。
tf.TensorSpecは、Tensorのメタデータ(shape,dtype,name)です。これは次のように使います。
@tf.function(input_signature=[tf.TensorSpec([None], tf.float32)])
def hoge(x):
return x * 2
hoge(tf.constant([0., 1., 2., 3.]))
tf.functionは、pythonの関数をTensorFlowのグラフに変換するものです(制限はあるようです)。tf.TensorSpecとtf.functionは、それぞれ、tf.contrib.eager.TensorSpecとtf.contrib.eager.defunに相当します。
tf.global_variables_initializerの消滅
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
でおなじみですが、これも消えます。
tf.get_xxの消滅
tf.get_variableやtf.get_collection、その他もろもろが無くなります。もしかするとget_collectionはtf.Graphのメソッドとして残るかも知れません(tf.Graphのドキュメントに、TF2.0で無くなるtf.GraphKeysを使った説明が残っているため、作業中かも知れません)。
まとめ
色々消えて驚愕しているのですが、現状で何を考えるべきかというと、次のことだと思います。
- 既存コードについて
- TF2.0に移行しやすいか。どこに修正が必要か。
- 移行スクリプトやtf.compat.v1で対処できるか。
- 移行しやすいようにどうリファクタリングするか。
- ライブラリについて
- TF2.0対応しそうか。
- 対応しなくても目的は達成可能か。
- TF2.0版を作成し世の中に貢献することを目指す。
- 新規コードについて
- TF2.0ではどういう設計が良いか。
- そもそも、機械学習プログラミングはどうあるべきか。
せっかくTF2.0にあわせてプログラムの書き方を変えないといけないのなら、機械学習プログラミングについて考え直すのもいいかもしれません。