祭囃子は遠く、

理系大学生のハッピーエヴリディを書いていきます。

TensorFlow:チュートリアル①

正月暇過ぎて(やる事はあるけど研究室の計算機に入れない)TensorFlowの勉強をしました。
適当にまとめておこうと思います、基本的には個人用というか僕の理解で適当に書く予定です。
あってるか間違ってるか知らないよ、という事

1.最初に

出展元は基本的にはこれ
Getting Started  |  TensorFlow
ここGetting Started With TensorFlowからボチボチまとめて行きます。
もっと言うと検索すると掃いて捨てるほど翻訳記事とかあるから、そっち見た方がいいかも…
一応差別化的な意味合いで物理っぽい視点から書けたらいいなとかは思ってます。(今回は無理)

想定される読者は

  1. pythonのプログラミングよく分かってない人(僕)
  2. 簡単に機械学習を体験してみたい人(僕)
  3. なんか今はなんも知らんけどゆくゆくはDeep-Learning触りたい人(僕)

俺得でしかなさそう

2.TensorFlowの基本

よく分かってないのに基本を書いていきます、ええ。
pythonやってる人は読めばすんなり入っていくタイプの奴だと思う(クラスとかオブジェクトとか無縁なプログラミングばっかしてるから慣れない)
導入の方法は調べて下さい・・・。
qiita.com
僕はこれ参考にした流れで入れました。

・TensorFlowって何

僕が聞きたい、凄いpythonのライブラリ・・・?
テンソルの計算が上手いらしい。(テンソルが得意でイメージつかなければ、行列とかの線型代数得意マンを想像すればよさそう)
Deep-Learningにも使われてそう。

・TensorFlowをとりあえず動かす
import tensorflow as tf #TensorFlowライブラリをtfとして読み込みますよ
node1 = tf.constant(3.0, dtype=tf.float32) #node1に定数3を代入、型は浮動小数点単精度です
node2 = tf.constant(4.0) #node2に定数4を代入します
print(node1, node2) #node1,node2を表示します

これが所謂HelloWorld的なヤツ?になってそう。単純に変数に定数を入れただけ。
ここで思ったのは(pythonド初心者並感)

  • 一々tf.を付ける(オブジェクトなんちゃらのアレ?本当に詳しくないから知らない)
  • 変数名nodeってわざわざ書くの意味あるんか?重過ぎん?最初ならx、yでええやん
  • constantでわざわざ用意されてるのなんでや
  • printで変なのでてくるけど?

ってな感じ。
解答としては

  • そうっぽい?知らん
  • そもそも変数のイメージがグラフ理論的になってそう、独立した箱というより変数同志の「繋がり」を重視したイメージ?(かっちょいい図を手描きしました)そもそもグラフ理論の言葉でこの丸いヤツをノードっていうからそれはそうなのかも。

f:id:ta_ichi:20180104023219j:plain:w300

  • 調べるとどうやらあとから値を変えたりする事が出来ないように用意されているらしい。Fortranでいうparameter指定(誰にもつたわらない)
  • これは以下に詳しく書く

なんか値としてはき出させるにはSessionしなきゃダメらしい、僕の中のイメージでは実行ボタンとか、コンパイルに近い。

import tensorflow as tf #TensorFlowライブラリをtfとして読み込みますよ
node1 = tf.constant(3.0, dtype=tf.float32) #node1に定数3を代入、型は浮動小数点単精度です
node2 = tf.constant(4.0) #node2に定数4を代入します
#これを新たに書く
sess = tf.Session() #セッションを打ち込むの面倒だからsessにします
print(sess.run([node1, node2]))#node1,node2を実行(3.0,4.0と出てくるはず)

これで値としてやっとはき出されますね!ハローワールドにしてはめんどい!!!!!
あと地味にsess = tf.Session()ってFortran使ってると目がびっくりする、関数をぶち込んでるようなものなので

・もうちょっと動かす

定数をはき出させただけでしたが、足し算したりなんたりしてみましょう。

import tensorflow as tf #TensorFlowライブラリをtfとして読み込みますよ
from __future__ import print_function #なんかからprintの関数持ってきますよ(これ分かってない)

node1 = tf.constant(3.0, dtype=tf.float32) #node1に定数3を代入、型は浮動小数点単精度です
node2 = tf.constant(4.0) #node2に定数4を代入します
node3 = tf.add(node1, node2) #node1とnode2を足し算しましょう!

sess = tf.Session() #セッションを打ち込むの面倒だからsessにします
print("node3:", node3) #7じゃないよ
print("sess.run(node3):", sess.run(node3)) #ちゃんとセッションして実行すると7になるよ

これが足し算、tf.addってところでやってるのでコレはわかりやすいと思います。
上のかっこいい図の右端が足し算のイメージ

import tensorflow as tf #TensorFlowライブラリをtfとして読み込みますよ
from __future__ import print_function #なんかからprintの関数持ってきますよ(これ分かってない)

a = tf.placeholder(tf.float32) #aに浮動小数点単精度の値を後で入れるよ
b = tf.placeholder(tf.float32) #bに浮動小数点単精度の値を後で入れるよ
adder_node = a + b  #まだ値は決まってないけど足し算したものを左辺に入れるよ

sess = tf.Session() #セッションを打ち込むの面倒だからsessにします
print(sess.run(adder_node, {a: 3, b: 4.5})) 
#aに定数3bに定数4.5を入れてその足した奴を表示+実行
print(sess.run(adder_node, {a: [1, 3], b: [2, 4]})) 
#aとbに定ベクトル入れて足し算した奴を表示+実行

コレが一番pythonプログラミングというか普通な感じしますね。
変数宣言して入れて、計算して・・・といった素朴なコードです。

でも変数〜〜って感じのヤツは次の方で(もしかしたら大きな仕様の違いがあるかも、分からんけど)

import tensorflow as tf #TensorFlowライブラリをtfとして読み込みますよ
from __future__ import print_function #なんかからprintの関数持ってきますよ(これ分かってない)

W = tf.Variable([.3], dtype=tf.float32) #Wに0.3を入れる、これは後から変更可能
b = tf.Variable([-.3], dtype=tf.float32) #bに−0.3を入れる、これは後から変更可能
x = tf.placeholder(tf.float32) #浮動小数点単精度の値を後で入れるよ
linear_model = W*x + b #この計算をするよ、そして左辺ににぶち込む

sess = tf.Session() #セッションを打ち込むの面倒だからsessにします
init = tf.global_variables_initializer() #グローバル変数とか初期化
sess.run(init) #初期化実行

print(sess.run(linear_model, {x: [1]})) #x=1で上の式を計算するよ

まぁ上との違いは先に値を入れてるとこですかね?それ以外はよくわかりません、あとはテンソルのランク(ベクトルか、定数かとか)を先に決めてるのかな?
あとは tf.global_variables_initializer()ですが、これは無くても動くけどやった方が大概いい系のヤツだと思います。
どんどん足し算していく時とかに、最初初期化しないとヤバめな事起こったりするアレ防止とか・・・?

まあ今回はこのくらいにしときますか。

終わりに

今回はプログラム全コメ+毎回の全文貼りとかにしたけど、どうでしょうか?
僕がこうだったらいいかなぁと思って勝手にやったので、読む人にはどうなんでしょう。

次は冒頭のサイトで、これらを使って軽い学習をしてるコンテンツの説明と、その次のMNIST For ML Beginnersに載ってる画像認識のところまで行けたらいいかなぁ。
画像認識の所はもうちょい理解してからじゃないと書くのが怖いかも。