Edited at

TensorFlow2.0でFizzBuzz書いてみた


初めに

以前にTensorFlowでFizzBuzz書いてみたという記事を書きました。その際、


TensorFlow2.0はDefine by Runになるそうですが、そうするとデバッグも楽になるのかなぁ。


と書きましたが、TensorFlow2.0 PreviewをGoogle Colabで試せるようになりましたので、TensorFlow2.0でFizzBuzzを書いてみました。Google Colabって何?という方はGoogle Colabの使い方まとめをご覧下さい。


想定読者


  • TensorFlow2.0がどんな感じか知りたい方

  • FizzBuzzを愛する方


参考にさせて頂いたページ


FizzBuzz

実は公式チュートリアルにFizzBuzzがサンプルとして載っていますので、それを引用します。

def fizzbuzz(max_num):

#from IPython.core.debugger import Pdb; Pdb().set_trace()
counter = tf.constant(0)
max_num = tf.convert_to_tensor(max_num)
for num in range(1, max_num.numpy() + 1):
num = tf.constant(num)
if int(num % 3) == 0 and int(num % 5) == 0:
print('FizzBuzz')
elif int(num % 3) == 0:
print('Fizz')
elif int(num % 5) == 0:
print('Buzz')
else:
print(num.numpy())
counter += 1

以前と比べてかなりシンプルになりました。いくつか調べた結果を書いてみます。


  • tf.convert_to_tensorは以前から存在したAPIです。max_num = tf.convert_to_tensor(max_num)なんてする必要はないのですが、その後のTensorの扱い方を理解するためにintをTensorに変換しているのだと思います

  • それが表れているのがrange(1, max_num.numpy() + 1)です。以前のTensorは<tf.Tensor 'Const_11:0' shape=() dtype=int32>という情報を持っていましたが、TensorFlow2.0では<tf.Tensor: id=610, shape=(), dtype=int32, numpy=0>という情報を持っており、numpyの部分が増えています。.numpy()によりその値を取得していると思われます。ちなみに.numpy()を使わずにrange(1, max_num + 1)としても問題なく動きました


  • if int(num % 3) == 0と書けるようになりました。前回はこれをtf.cond(tf.equal(tf.mod(num, 3), 0)と書いていましたので、より直感的に書けるようになりました。tf.modはTensorFlow2.0にはいないように見えますが、tf.condtf.equalは依然あるようです(需要があるのかわかりませんが)


  • from IPython.core.debugger import Pdb; Pdb().set_trace()を使ってこれらを調べました

呼び出しと実行結果はこちらです。

fizzbuzz(15)

1

2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz

tf.Session()tf.global_variables_initializer()がなくなりました。こちらもシンプルになりましたね!


最後に

これだけ見ているとTensorFlow2.0は直感的な記述が可能になった気がします。公式チュートリアルを実行しながら引き続き勉強しようと思います。