TensorFlowの公式チュートリアルをやってみました
簡単な計算グラフの話のみです。
TensoFlowをインストール済みとしてください。
TensorFlow入門
ターミナルでpython
を実行(以降インタプリタで行う)
Tensorflowインポート
>>>import tensorflow as tf
計算グラフ
>>>node1 = tf.constant(3.0, dtype=tf.float32) #定数3.0を設定
>>>node2 = tf.constant(4.0)
>>>print(node1, node2)
ノードは評価されると3.0と4.0を生成する。
ノードを実際に評価するには、セッション内で計算グラフを実行する必要がある。
Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0", shape=(), dtype=float32)
Sessionオブジェクトを作成し、runメソッドを呼び出して評価する計算グラフ(node1,node2)を実行する。
>>>sess = tf.Session()
>>>print(sess.run([node1, node2]))
[3.0, 4.0]
これらのノード(node1,node2)を組み合わせることによって複雑な計算(新しい計算グラフ)を作成する。
とりあえずAdd(足し算を作成する)
>>>node3 = tf.add(node1, node2) # node1 + node2
>>>print("node3:", node3)
>>>print("sess.run(node3):", sess.run(node3))
node3: Tensor("Add:0", shape=(), dtype=float32)
sess.run(node3): 7.0
このグラフのままでは定数が設定されているため、placeholder
を利用して、外部入力を受け付けるようにする。
>>>a = tf.placeholder(tf.float32)
>>>b = tf.placeholder(tf.float32)
>>>adder_node = a + b # + provides a shortcut for tf.add(a, b)
>>>print(sess.run(adder_node, {a: 3, b: 4.5}))
>>>print(sess.run(adder_node, {a: [1, 3], b: [2, 4]}))
7.5
[ 3. 7.]
より計算グラフを複雑にしてみる。
>>>add_and_triple = adder_node * 3.
>>>print(sess.run(add_and_triple, {a: 3, b: 4.5}))
実際に数式に直してみるとこんな計算をしている。(a + b) * 3
22.5
機械学習では同じ入力で新しい出力が得られるためにグラフを修正できる必要がある。変数を使用すると訓練可能なパラメータをグラフに追加できる。
tf.constant
は呼び出すと初期化され定数が設定されるため、変更ができない。
tf.Variable
は変数は呼び出しても変数は初期化されず、更新ができる。
>>>W = tf.Variable([.3], dtype=tf.float32)
>>>b = tf.Variable([-.3], dtype=tf.float32)
>>>x = tf.placeholder(tf.float32)
>>>linear_model = W * x + b
>>>init = tf.global_variables_initializer()
>>>sess.run(init)
>>>print(sess.run(linear_model, {x: [1, 2, 3, 4]}))
init = ..~
の部分はTensorFlowプログラムのすべての変数を初期化するための変数。sess.run(init)
を呼び出すまで変数は初期化されない
[ 0. 0.30000001 0.60000002 0.90000004]
目的の値(教師データ)の値を提供するためのプレースホルダーが必要であり、損失関数も必要である。
損失関数
現在のモデルが出力した値が教師データからどれだけ離れているかを測定します。モデルが出力した値と教師データの線形回帰の標準損失モデルを使用する。linear_model - y
は各要素がタイオする誤差のベクトルを計算し、tf.square
でそのエラーを二乗する。その後mすべての誤差を抽象化する単一スカラーを生成するtf.reduce_sum
を呼ぶ。
>>>y = tf.placeholder(tf.float32)
>>>squared_deltas = tf.square(linear_model - y)
>>>loss = tf.reduce_sum(squared_deltas)
>>>print(sess.run(loss, {x: [1, 2, 3, 4], y: [0, -1, -2, -3]}))
printの出力は損失関数の値を返しています。
23.66
{x: [1, 2, 3, 4], y: [0, -1, -2, -3]}
入力の2つの値を見ると,W = -1 b = 1
の時に損失が0になりそうです。
tf.assign
を利用して、重みとバイアスを変更できる。
>>>fixW = tf.assign(W, [-1.])
>>>fixb = tf.assign(b, [1.])
>>>sess.run([fixW, fixb])
>>>print(sess.run(loss, {x: [1, 2, 3, 4], y: [0, -1, -2, -3]}))
0.0