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

TensorFlow™ on Databricks

Illustration

プレースホルダー

これまでは変数を使用してデータを管理してきましたが、より基本的な構造としてプレースホルダーがあります。プレースホルダーとは、あとでデータを割り当てられる変数のことです。これにより、データを必要とすることなく演算を作成し、計算グラフを構築できます。TensorFlow の用語では、これらのプレースホルダーを通してデータをグラフにフィードします。

 

import tensorflow as tf

x = tf.placeholder("float", None)
y = x * 2

with tf.Session() as session:
    result = session.run(y, feed_dict={x: [1, 2, 3]})
    print(result)

 

この例は、これまでの例とは少し異なります。詳しく見てみましょう。

まず、通常どおり tensorflow をインポートします。次に、プレースホルダー x というあとで値を保存するメモリ内の場所を作成します。

次に、x を 2 で乗算する演算であるという Tensor を作成します。まだ x の初期値を定義していないことに注意してください。

これでオペレーション (y) が定義され、セッションで実行できるようになりました。セッションオブジェクトを作成し、y 変数だけを実行します。これは、より大きな演算グラフを定義した場合でも、グラフのほんの一部分だけを実行可能ということです。このサブグラフ評価は、実は TensorFlow のちょっとしたセールスポイントであり、同様のことを行う他の多くのライブラリには存在しないものです。

y を実行するには、x の値に関する知識が必要です。これらを feed_dict 引数で定義して実行します。ここでは、x の値が [1, 2, 3] であるとします。y を実行すると、[2, 4, 6] の結果が得られます。

プレースホルダーは、静的にサイズを設定する必要はありません。x が任意の長さを取れるように、プログラムを更新してみましょう。x の定義を次のように変更します。

 

x = tf.placeholder("float", None)

 

feed_dictx の値を定義する際、値はいくつでも指定できます。コードは今までどおり動作し、同じ答えを返すはずですが、feed_dict にいくつの値があっても動作するようになりました。

プレースホルダーは複数の次元を持つことができ、配列を格納できます。次の例では、3×2 の行列を作成し、そこに数値を格納します。次に、先ほどと同じ演算を使用して、要素ごとに数値を 2 倍にします。

 

import tensorflow as tf

x = tf.placeholder("float", [None, 3])
y = x * 2

with tf.Session() as session:
    x_data = [[1, 2, 3],
              [4, 5, 6],]
    result = session.run(y, feed_dict={x: x_data})
    print(result)

 

プレースホルダーの最初の次元は、None です。これは、任意の数の行を含められることを意味します。2 番目の次元は 3 に固定されており、各行には 3 列のデータが必要であることを意味します。

これを拡張して、任意の数の None 次元を取ることが可能です。この例では、前回のレッスンで使用した画像をロードし、その画像のスライスを保存するプレースホルダーを作成します。スライスは画像の 2D セグメントですが、各「ピクセル」には 3 つのコンポーネント(赤、緑、青)があります。したがって、最初の 2 つの次元には None が必要ですが、最後の次元には 3 つ(あるいは None)が必要です。次に、TensorFlow のスライスを使用して、画像からサブセグメントを取り出します。

 

import tensorflow as tf
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import os

# First, load the image again
dir_path = os.path.dirname(os.path.realpath(__file__))
filename = dir_path + "/MarshOrchid.jpg"
raw_image_data = mpimg.imread(filename)

image = tf.placeholder("uint8", [None, None, 3])
slice = tf.slice(image, [1000, 0, 0], [3000, -1, -1])

with tf.Session() as session:
    result = session.run(slice, feed_dict={image: raw_image_data})
    print(result.shape)

plt.imshow(result)
plt.show()

 

  1. TensorFlow の配列に関する他の関数については、公式ドキュメントを参照してください。
  2. 画像を 4 つの「角」に分割し、再度つなぎあわせます。
  3. 画像をグレースケールに変換します。これを行う 1 つの方法は、単一のカラーチャンネルだけを取り出し、それを表示することです。別の方法では、3 つのチャンネルの平均をグレー色として取得します。