20190203のTensorFlowに関する記事は1件です。

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は直感的な記述が可能になった気がします。公式チュートリアルを実行しながら引き続き勉強しようと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む