TensorFlow 2.0 主な変更点


前回、【深属学習】について色んな記事を話しました。

今回の記事はGoogleが2019年初に公開したTensorFlow 2.0について紹介します。

本番リリースではないですが、現在の時点TensorFlow 2.0 Betaです。

 

リリース日のタイムライン:

2019年3月4日 TensorFlow 2.0 Alphaのリリース

2019年6月日8 TensorFlow 2.0 Betaのリリース

>  pip install tensorflow==2.0.0-beta0

本記事では、TensorFlow 2.0の変更点についてまとめたいと思います。

Google I/O’19のアナウンスとDesign Documentを参考しました。

TensorFlowのアナウンスにもある通り、TensorFlow 2.0における大きな変更点は以下の4つになります。

1.Eager Modeのデフォルト化

2.Sessionとplaceholder消滅

3.kerasが、TensorFlow標準の高レベルAPIに

4.TensorFlow 2.0の全体構成

1. Eager Modeのデフォルト化

eager executionはDefine-by-runの機能になります。Define by Runでは、計算グラフ(ニューラルネットの構造)の構築とデータを流しながら行います。Define and Runでは、計算グラフを構築してから、そこにデータを流していきます。

従来の tensorflow は Define-and-run で、 PyTorch やChainer は Define-by-run です。

eager execution は tensorflow で Define-by-run を可能にする仕組みです。

Eager Modeを利用する場合、 TensorFlow2.xはenable_eager_executionが必要なくなりました。

TF 1.X
TF 2.0
import tensorflow as tf
tf.enable_eager_execution()

x = tf.contrib.eager.Variable(0.)
y= tf.contrib.eageer.Variable(1.)
for iteration in range(50):
x.assign(x + y)
y.assign(y / 2)

print(x.numpy())
import tensorflow as tf

x = tf.Variable(0.)
y= tf..Variable(1.)
for iteration in range(50):
x.assign(x + y)
y.assign(y / 2)

print(x.numpy())

 

 

2. Sessionとplaceholderがなくなりました

TensorFlow 1.x では、まずグラフを構築してから、tf.Session.run() でグラフを実行します。TensorFlow2では、Sessionがいりませんでした。

または、TensorFlow 2では、placeholderは入力の値自体と重複して二度手間なコードなので、placeholderも消滅しました。

 

TF 1.X
TF 2.0
W = tf.Variable(
  tf.glorot_uniform_initializer()(
    (10, 10)))
b = tf.Variable(tf.zeros(10))
c = tf.Variable(0)

x = tf.placeholder(tf.float32)
ctr = c.assign_add(1)
with tf.control_dependencies([ctr]):
  y = tf.matmul(x, W) + b
init =
  tf.global_variables_initializer()
with tf.Session() as sess:
  sess.run(init)

  print(sess.run(y,
  feed_dict={x: make_input_value()}))
  assert int(sess.run(c)) == 1
W = tf.Variable(
  tf.glorot_uniform_initializer()(
    (10, 10)))
b = tf.Variable(tf.zeros(10))
c = tf.Variable(0)

@tf.function
def f(x):
  c.assign_add(1)
  return tf.matmul(x, W) + b

print(f(make_input_value())
assert int(c) == 1





 

 

3. kerasが、TensorFlow標準の高レベルAPIに

TensorFlow 1.xにおけるtf.kerasを使ったコードは、基本的に何も変更することなく、そのままTensorFlow 2.0でも使えます。ただ、keras の api と tf の api が混在しているのを整理しました。

 

tf.layers  ↔ tf.keras.layers

tf.losses   ← tf.keras.losses

tf.metrics   ← tf.keras.metrics

…など

 

さらに、Tensorflow2では、Model Subclassesモードを追加しました。Model Subclassesはクラスの構成でグラフを作成することができます。

 

TF 1.X、2.0
TF 2.0 #Model Subclasses
#For Beginner
model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
             loss='sparse_categorial_crossentropy',
             metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)
#For Exports
#Model Subclasses

class MyModel(tf.keras.Model):
  def __init__(self, num_classes=10):
    super(MyModel, self).__init__(name='my_model')
    self.dense_1 = layers.Dense(32, activation='relu')
    self.denst_2 = layers.Dense(num_classes,activation='sigmoid')

  def call(self, inputs):
    # Define your forward pass here,
    x = self.dense_1(inputs)
    return self_dense2(x)

 

 

4. TensorFlow 2.0の全体構成

 

TensorFlow 2.0の全体構成をまとめると、下記の図になります。

左側が訓練(TRAINING)の機能、右側が運用環境へのデプロイ(DEPLOYMENT)の機能です。

tensorflow2_1

 

まとめ

TensorFlow 2.0 beta版の新機能・主な変更点をまとめました。以前Pytorchとchainerの強みに対して、Eager Modeのデフォルト化のデフォルト化が一番大きな変更ではないでしょうか。Sessionとplaceholder消滅すると作成しやすくになりました。KerasのTensorFlowの強みを強化しました。TensorFlow 2.0の全体構成を整理して使い方法を増やすでしょう。まだbeta版なので、TensorFlow 2.0のリリースを楽しみにしながら待ちたいと思います。