- 投稿日:2019-02-03T17:07:38+09:00
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.condやtf.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は直感的な記述が可能になった気がします。公式チュートリアルを実行しながら引き続き勉強しようと思います。