誰でも出来るTensor基礎3!変数の使い方はどうすればいいの?

誰でも出来るTensor基礎3!変数の使い方はどうすればいいの?

セブンイレブンのクジが当たってしまいます。

違うんです。自慢じゃないんです。

 

・・・・・・応募券が欲しいんです。

・・・・・乃木坂nanacoカードが欲しいんです。

 

どーも、アイーンです。

 

 

今日も前回の続きからTensorしていきます。

もちろんimport tensorflow as tf とsess=tf.Session()は必須です。

 

入力が出来るようになったら、次はもちろん

変数でしょう。

 

変数はプログラミングの教本でも

最序盤に登場しますね。

 

今回は、変数を扱うパートになります。

 

それではいってみよ~。

 

変数の書き方

 

変数の書き方は

tf.Variable()

です。

W = tf.Variable( [.3] , tf.float32 )
b = tf.Variable( [-.3] , tf.float32 )
x = tf.placeholder( tf.float32 )

 

linear_model = W * x + b

 

以前Chainerの時にもやりましたが

ここで、単純なパーセプトロンを一つ作ってみましょう。

\(f(x)= w * x + b\)

重みWとバイアスbを変数で作ります。

xはもちろん入力値。

 

でも変数は初期化してやらないといけないようです。

初期化する処理を追加しときましょう。

 

変数の初期化

init = tf.global_variables_initializer()

sess.run(init)

tf.global_variables_initializer()には、プログラムに組み込まれたグローバル変数をすべて初期化する効果があります。

 

グローバル・バリアブルズ・イニシャライザー

 

中二病っぽい名前と能力が好きです。

イメージは、”無骨でメカニカルな片手銃”です。

 

sess.run(init)でinitを走らせることで効果を発揮します。

 

使用する際に女性ボイスで「”対象を無力化します”」とか流れてほしいです。

 

さぁ、先へ進みましょう。

Wには0.3

bには-0.3

を入れました。

試しに入力してみます。

xに「1.  2.  3.  4.」をセットして発射してみ…動かしてみると

「0. 0.3 0.6 0.90000004」

 

と計算されました。

 

さぁ、こっからニューラルネットワークぽくしていきます。

重みバイアスが出来ました。

あとはラベルデータ損失関数です。

 

y = tf.placehorder(tf.float32)

squared_deltas = tf.square(linear_model – y )

loss = tf.reduce_sum(squared_diltas)

 

まずはyをラベルデータにするべく入力値として用意します。

squared_deltasに入れたのは

tf.square()

入れたデータを二乗してくれます。

負の数値を正に変えるための二乗誤差ですね。

lossにはtf.reduce_sum()

これによりベクトルをまとめて合計してくれます。

このlossで、ラベルデータとモデルデータとの誤差を測定しましょう。

reduce_sumの例としてあげておくと

こんな感じで使えます。

x = tf.constant([[1, 1, 1], [1, 1, 1]])
tf
.reduce_sum(x)
>> [6]

tf.reduce_sum(x, 0)  # [2, 2, 2]
>>[2],[2],[2]

未経験からIT業界へ転職なら【WebCampPRO】

 

さぁ準備が出来ました。

入力してみます。

 

print(sess.run(loss, {x:[1, 2, 3, 4], y:[0, -1, -2, -3 ]}))

 

x に[1. 2. 3. 4.]

yに[0. ,-1 ,-2 , -3]

を入れてlossにぶち込むと

23.66

と出力されました。

これが、全体的にこれだけラベルデータからズレてるという数値です。

 

ここで、変数を変更してみたいと思います。

 

変数値の変更

変数の変更には

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]}))

 

Wをー1に、bを1に変更してみます。

出力結果は0.0

誤差なんぞございません。

 

切りが良いので今日はここまで。

 

まとめ

 

変数なくしてプログラムなぞ出来るものか。

constantは定数

placeholderは入力

Variableは変数

使い方も分かりました。

 

じゃ次は?

順番的にはオプティマイザーかな。最適化関数です。

 

これで貴方の肩書は「Tensor初級」です。

中級までの道は果てしなく遠い・・・。

 

それでは。