HELLO CYBERNETICS

深層学習、機械学習、強化学習、信号処理、制御工学、量子計算などをテーマに扱っていきます

TensorFlow2.0 Preview版が出ました!

 

 

follow us in feedly

TensorFlow 2.0発表!

ついに動きがありましたね。APIは下記で見ることが出来ます。名前空間がスッキリしていることに気づくはずです。

www.tensorflow.org

v1.12.0からv2.0へコードを書き換えるためのツールも整備されていく模様です。

tensorflow/tensorflow/tools/compatibility at master · tensorflow/tensorflow · GitHub

また、2.0の発表して間もなく、githubにはチュートリアルのリポジトリが出現しました。さすがは注目度が高いですね。

github.com

コード周辺の変更

さて、TensorFlow2.0でどのように書き方が変わったのかというと、以前からお伝えしてきたとおり、EagerをデフォルトとしたKerasAPIを全面に出した書き方が中心となっていくようです。それに伴って、多くの方が今まで使っていたモジュールにあったはずの関数やクラスがKerasに統廃合されている可能性がかなり高くなっています。

tf.train.GradientDescentOptimizer()などを始め、tf.train クラスには最適化手法等の実装は一切なくなっておりました(checkpoint等の学習を管理する系のモジュールとなったようです)。代わりに最適化手法は tf.keras.optimizers モジュールに統合されていました。また、tf.lossesなども多くの方が利用していたと思われますが、損失関数などは tf.keras.losses に移動されています。

tf.traintf.keras.optimizers

tf.lossestf.keras.losses

細かい例にはなりますが、tf.losses.sparce_softmax_cross_entropyと同様の動きをするものは、tf.keras.losses.sparse_categorical_crossentropyになっているなど、命名方法が若干異なったりするので注意が必要です。また、accuracyやrecallなどを求める便利なmetricsは tf.keras.metricsにまとまっています。

例えばロジスティック回帰を行う場合には下記のようなコードを書くことになるでしょう。

x_train_ = tf.convert_to_tensor(train_inputs_of_numpy)
y_train_ = tf.convert_to_tensor(train_labels_of_numpy)

# Logistic regression model
model = tf.keras.layers.Dense(output_size, activation="sigmoid")

# loss function
def loss_fn(model, x, y):
    predict_y = model(x)

    # return shape is (x.shape[0], ) ; each element is each data's loss.
    return tf.keras.losses.binary_crossentropy(y, predict_y)

def accuracy_fn(model, x, y):
    predict_y = model(x)

    # return shape is (x.shape[0], ) ; each element is 1 or 0.(If y[i] == y_pre[i], the i th element is 1). 
    return tf.keras.metrics.binary_accuracy(y, predict_y)

# optimizer
optimizer = tf.keras.optimizers.SGD(learning_rate=learning_rate)


for epoch in range(num_epochs):
    with tf.GradientTape() as tape:
        loss = loss_fn(model, x_train_, y_train_)
    grads = tape.gradient(loss, model.variables)
    
    accuracy = accuracy_fn(model=model, x=x_train_, y=y_train_)
    
    if (epoch+1) % 5 == 0:
        print(
            "loss: {:0.3f},  acc: {}".format(
                tf.reduce_sum(loss).numpy(),   # using TF function or numpy method
                accuracy.numpy().mean()         # both of ok.
            )  
        ) 
    # update prameters using grads
    optimizer.apply_gradients(zip(grads, model.variables))

tf.layers は完全に廃止されており、tf.keras.layersを利用していくことになるようです。また、地味な変更ですが tf.randomモジュールが出来たので、今まで tf.random_normalなどとしてきたものは tf.random.normalと書くことになります。

学習周りに関してはeager executionを触っていた人にとっては、特に違和感のない変更となっており受け入れやすいものになっています。 一方で、ecosystem周り(TF hubやTF probabilityなど)は2.0向けに整備がまだ完全にはなされていません。要は今回廃止されたAPIを内部に含んでいる場合には動かすことが出来ないというわけです。ここらへんの整備と本体のデバッグ含めてしばらくpreview版が続きそうな雰囲気です。

tutorial

Eagerで書いていたコードを、ブランチ切ってmaster側を2.0に変えていくことにしました。

github.com

また冒頭で述べた下記のリポジトリも整備が進みそうなので注目しておいて良いと思います。

github.com

なにはともわれ、まだ実用段階ではなさそうなので、気長に見守りましょう。