note.nkmk.me

TensorFlowの定数、変数、プレースホルダーの使い方

Date: 2017-08-16 / tags: Python, TensorFlow, 機械学習
スポンサーリンク

TensorFlowの基礎の基礎の基礎を確認

Googleによって開発されたオープンソースの機械学習ライブラリ、TensorFlow。

基礎の基礎の基礎ぐらい基本的な、定数と簡単な演算、変数、プレースホルダーの使い方について説明する。

定数(tf.constant)

tf.constant()で定義する。

import tensorflow as tf

const1 = tf.constant(5)
const2 = tf.constant(10)

5とか10が初期値になる。

が、そのままprint()しても値は表示されない。

print(const1)
print(const2)
# Tensor("Const:0", shape=(), dtype=int32)
# Tensor("Const_1:0", shape=(), dtype=int32)

これは、tf.constant()ではあくまでも計算グラフが定義されただけだから。実際の値を確認するにはセッションを開始して処理を実行する必要がある。

with tf.Session() as sess:
    const1_result, const2_result = sess.run([const1, const2])
    print(const1_result)
    print(const2_result)
# 5
# 10

演算(tf.add, tf.multiply)

定数が定義できたので、簡単な演算として足し算と掛け算を行う。

import tensorflow as tf

const1 = tf.constant(5)
const2 = tf.constant(10)

add_op = tf.add(const1, const2)
mul_op = tf.multiply(add_op, const2)

足し算と掛け算のオペレーションをそれぞれadd_opmul_opとして定義する。例では、2つの定数の足し算と、その結果と定数2の掛け算になっている。

定数と同様、これもそのままprint()しても結果は表示されない。

print(add_op)
print(mul_op)
# Tensor("Add:0", shape=(), dtype=int32)
# Tensor("Mul:0", shape=(), dtype=int32)

セッションを開始して処理を実行すると演算結果が出力される。

with tf.Session() as sess:
    add_result, mul_result = sess.run([add_op, mul_op])
    print(add_result)
    print(mul_result)
# 15
# 150

なお、足し算と掛け算は演算子+*でも定義することができる。

add_op_2 = const1 + const2
mul_op_2 = add_op_2 * const2

with tf.Session() as sess:
    add_op_2_result, mul_op_2_result = sess.run([add_op_2, mul_op_2])
    print(add_op_2_result)
    print(mul_op_2_result)
# 15
# 150

変数(tf.Variable, tf.assign)

tf.Variable()で定義する。

var = tf.Variable(10)

tf.assign()で新たな値を代入する。

const = tf.constant(5)
calc_op = var * const
assign_op = tf.assign(var, calc_op)

変数はセッションのはじめに初期化する必要がある。すべての変数を初期化するglobal_variables_initializer()を実行する。

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    print(sess.run(var))

    sess.run(assign_op)
    print(sess.run(var))

    sess.run(assign_op)
    print(sess.run(var))
# 10
# 50
# 250

セッション内では変数の値は保持されるため、オペレーションを複数回実行すると結果が更新されていく。

プレースホルダー(tf.placeholder)

プレースホルダーはデータが格納される入れ物。データは未定のままグラフを構築し、具体的な値は実行する時に与える。

tf.placeholder()で定義する。

値は、Session.run()の引数feed_dictに辞書型で指定する。

import tensorflow as tf

const = tf.constant(1)
holder = tf.placeholder(tf.int32)
add_op = const + holder

with tf.Session() as sess:
    result = sess.run(add_op, feed_dict={holder: 5})
    print(result)

    result = sess.run(add_op, feed_dict={holder: 10})
    print(result)
# 6
# 11

引数で指定した値で計算が実行されている。

tf.placeholder()の引数でshapeを指定して配列を与えることもできる。

holder1 = tf.placeholder(tf.int32)
holder2 = tf.placeholder(tf.int32, [3])
mul_op = holder1 * holder2

with tf.Session() as sess:
    result = sess.run(mul_op, feed_dict={holder1: 2, holder2: [0, 1, 2]})
    print(result)

    result = sess.run(mul_op, feed_dict={holder1: 5, holder2: [0, 10, 20]})
    print(result)
# [0 2 4]
# [  0  50 100]

さらにNoneを使うと、実行時に任意のサイズの配列を与えることも可能。

holder1 = tf.placeholder(tf.int32)
holder2 = tf.placeholder(tf.int32, [None])
mul_op = holder1 * holder2

with tf.Session() as sess:
    result = sess.run(mul_op, feed_dict={holder1: 2, holder2: [0, 1]})
    print(result)

    result = sess.run(mul_op, feed_dict={holder1: 5, holder2: [0, 1, 2, 3, 4]})
    print(result)
# [0 2]
# [ 0  5 10 15 20]
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事