LoginSignup
5
4

More than 5 years have passed since last update.

TensorFlowチュートリアルをやってみた 第1回

Last updated at Posted at 2017-08-20

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を生成する。
ノードを実際に評価するには、セッション内で計算グラフを実行する必要がある。

printの出力
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]))
printの出力
[3.0, 4.0]

これらのノード(node1,node2)を組み合わせることによって複雑な計算(新しい計算グラフ)を作成する。
とりあえずAdd(足し算を作成する)

>>>node3 = tf.add(node1, node2) # node1 + node2
>>>print("node3:", node3)
>>>print("sess.run(node3):", sess.run(node3))
printの出力
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]}))
printの出力
7.5
[ 3.  7.]

より計算グラフを複雑にしてみる。

>>>add_and_triple = adder_node * 3.
>>>print(sess.run(add_and_triple, {a: 3, b: 4.5}))

実際に数式に直してみるとこんな計算をしている。(a + b) * 3

printの出力
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)を呼び出すまで変数は初期化されない

printの出力
[ 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の出力は損失関数の値を返しています。

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]}))
printの出力
0.0
5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4