今後 tf.layers が tf.keras.layers で置き換わるらしいという話を聞きました。
参考: https://www.tensorflow.org/api_docs/python/tf/layers/Layer
ということは全部 keras 風に書かないといけないの?と思ったのですが、実は layers の部分だけ置き換えるというのもできるようです。
このへんの書き換えで盛大にハマったのでメモを残しておきます。
例としてサイズ2のベクトルを受け取ってスカラーを返す単純なモデルを使います。
従来の tensorflow の書き方。
import numpy as np import tensorflow as tf inputs = tf.placeholder(tf.float32, shape=(None, 2)) dense = tf.layers.dense(inputs, 1) session = tf.Session() session.run(tf.global_variables_initializer()) result = session.run( dense, feed_dict={inputs: np.array([[1.0, -1.0]])} ) print(result)
tf.keras.layers を使って全部 keras 風に書く書き方。
import numpy as np import tensorflow as tf inputs = tf.keras.Input(shape=(2,)) dense = tf.keras.layers.Dense(1)(inputs) model = tf.keras.Model(inputs, dense) result = model.predict(np.array([[1.0, -1.0]])) print(result)
layers の部分だけ tf.keras.layers を使う書き方。
import numpy as np import tensorflow as tf inputs = tf.placeholder(tf.float32, shape=(None, 2)) dense = tf.keras.layers.Dense(1)(inputs) session = tf.Session() session.run(tf.global_variables_initializer()) result = session.run( dense, feed_dict={inputs: np.array([[1.0, -1.0]])} ) print(result)
tf.keras.Input は tf.placeholder の代わりに使える模様。tf.keras.Input を使う場合 shape にバッチサイズの次元は書かないことに注意。
import numpy as np import tensorflow as tf inputs = tf.keras.Input(shape=(2,)) dense = tf.keras.layers.Dense(1)(inputs) session = tf.Session() session.run(tf.global_variables_initializer()) result = session.run( dense, feed_dict={inputs: np.array([[1.0, -1.0]])} ) print(result)
最後にだめな事例。tf.keras.Input は tf.placeholder の代わりに使えるけれど、その逆は無理。tf.placeholder を tf.keras.Model の inputs として与えようとすると Input tensors to a Model must come from `tf.layers.Input` と怒られてしまいます。
import numpy as np import tensorflow as tf inputs = tf.placeholder(tf.float32, shape=(None, 2)) dense = tf.keras.layers.Dense(1)(inputs) # inputs は placeholder ではダメ! model = tf.keras.Model(inputs, dense) result = model.predict(np.array([[1.0, -1.0]])) print(result)
以上です。
どうか気をつけてほしい。テンサーフローのやみは深い。