メインコンテンツへジャンプ

TensorFlow™ on Databricks

Illustration

変数

TensorFlow は、要求されるまで実際には計算を実行せずに、計算を表現する方法です。この意味では、遅延コンピューティングの一種であり、コードの実行を大幅に改善できます。
  • 複素数変数の計算の高速化
  • GPU を含む複数のシステムにわたる分散計算
  • 一部の計算における冗長性の削減

では、実際に見てみましょう。以下は、非常に基本的な Python スクリプトです。

 

x = 35
y = x + 5
print(y)

 

このスクリプトは、「値 35 の変数 x を作成し、新しい変数 y の値を変数 x に 5 を足した値(現在は 40)に設定して出力する」というだけのものです。このプログラムを実行すると、値 40 が出力されます。Python に慣れていない場合は、basic_script.py という新しいテキストファイルを作成し、そのコードをコピーしてください。コンピュータに保存して、次のコードで実行します。

python basic_script.py

パス(basic_script.py)は、ファイルを参照する必要があることに注意してください。Codeフォルダにある場合は、次のようにします。

python Code/basic_script.py

また、Anaconda 仮想環境を有効化していることを確認してください。Linux の場合、プロンプトは次のようになります。

(tensorenv)username@computername:~$

実行できたら、TensorFlow に相当するものに変換してみましょう。

 

import tensorflow as tf

x = tf.constant(35, name='x')
y = tf.Variable(x + 5, name='y')

print(y)

 

これを実行すると、<tensorflow.python.ops.variables.Variable object at 0x7f074bfd9ef0> のようなおかしな出力が得られます。これは明らかに値 40 ではありません。

その理由は、このプログラムが上述のプログラムとはまったく異なることを行っているためです。このコードは、次のことを行います。

  1. tensorflow モジュールをインポートし、それを tf とする
  2. x という定数値を作成し、数値を 35 とする
  3. y という変数を作成し、方程式 x + 5 として定義する
  4. y として方程式のオブジェクトを出力する

微妙な違いは、前述のプログラムのように y に「x の現在値 + 5」が与えられていないことです。その代わりに、「この変数が計算されるとき、x の値(そのときの値 )を取得して 5 を足す」という方程式になってます。このプログラムでは、y の値の計算が実際に実行されることはありません。

それを修正しましょう。

 

import tensorflow as tf

x = tf.constant(35, name='x')
y = tf.Variable(x + 5, name='y')

model = tf.global_variables_initializer()

with tf.Session() as session:
    session.run(model)
    print(session.run(y))

 

print(y) ステートメントを削除し、代わりにセッションを作成して実際に y の値を計算するコードを用意しました。これはかなり定型的なものですが、次のように機能します。

  1. tensorflow モジュールをインポートし、それを tf とする
  2. x という定数値を作成し、数値を 35 とする
  3. y という変数を作成し、方程式 x + 5 として定義する
  4. tf.global_variables_initializer() で変数を初期化する(詳細は後述を参照)
  5. 値を計算するセッションを作成する
  6. 4 で作成したモデルを実行する
  7. 変数 y だけを実行し、その現在値を出力する

上記のステップ 4 では、マジックが起こります。このステップでは、変数間の依存関係のグラフが作成されます。この場合、変数 y は変数 x に依存し、その値は 5 を加えることで変換されます。この値が計算されるのはステップ 7 で、それまでは方程式と関係だけが計算されることを覚えておいてください。

1)定数は配列にすることも可能です。このコードが何をするか予測し、実行して確認します。

 

import tensorflow as tf


x = tf.constant([35, 40, 45], name='x')
y = tf.Variable(x + 5, name='y')


model = tf.global_variables_initializer()

with tf.Session() as session:
    session.run(model)
    print(session.run(y))

 

2)10,000 個の乱数(x とする)からなる NumPy 配列を生成し、方程式を格納する変数を作成します。

y = 5x2 − 3x+15

次のコードを使用して NumPy 配列を生成できます。

 

import numpy as np
data = np.random.randint(1000, size=10000)

 

この data 変数は、上記の質問 1 のリストの代わりに使用できます。一般的なルールとして、より大きな数値のリストや配列には NumPy を使用する必要があります。リストよりもメモリ効率がよく、計算が速いからです。また、リストでは通常利用できない関数(平均の計算など)も数多く提供しています。

3)ループ内の変数を更新することも可能です。これはあとで機械学習に使用します。次のコードを見て、それが何を行うか予測してみましょう。その後、実行して確認します。

 

import tensorflow as tf


x = tf.Variable(0, name='x')

model = tf.global_variables_initializer()

with tf.Session() as session:
    session.run(model)
    for i in range(5):
        x = x + 1
        print(session.run(x))
        

 

4)上記(2)と(3)のコードを使用して、コード np.random.randint(1000) の「ローリング」平均を計算するプログラムを作成します。つまり、ループを継続し、各ループで np.random.randint(1000) を 1 回呼び出し、ループごとに更新し続ける変数に現在の平均を格納します。

5)TensorBoard を使用して、これらの例のグラフを視覚化します。TensorBoard を実行するには、次のコマンドを使用します。:tensorboard --logdir=path/to/log-directory

 

import tensorflow as tf

x = tf.constant(35, name='x')
print(x)
y = tf.Variable(x + 5, name='y')

with tf.Session() as session:
    merged = tf.summary.merge_all()
    writer = tf.summary.FileWriter("/tmp/basic", session.graph)
    model =  tf.global_variables_initializer()
    session.run(model)
    print(session.run(y))

 

TensorBoard の詳細については、視覚化のレッスンをご覧ください。