Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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
taigamikami
大学生 自分の勉強・メモとしてQiitaに投稿しています。おかしいと思う部分は遠慮なくご指摘いただければと思います。 Ruby/Rails/Swift/iOS/Python
https://taigamikami.github.io/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした