Tensorfowメモ
自分なりに書き残しているメモです
Tensorflowの構造
グラフ、演算ノード、テンソルの構想
グラフとは?
複数のニューロンからなる一つの層を表す図形
φ(X * W + b)
ノードとノードを結ぶ辺によって構成
演算ノード・変数ノード・プレスホルダーノードなどが存在
テンソルとは
グラフを流れる量
テンソルはn次元の配列あるいはリスト
主な表記
変数 tf.Variable
行列の積 tf.matmul
φの適用 tf.nn.relu
グラフの定義
graph.py
# Wを入れる変数の定義
weights = tf.Variable()
# bを入れる変数の定義
bias = tf.Variable()
# 層の働きを φ(X*W+b) で定義
#ここではφはreluを使用
#imagesは、この層が受ける入力
#hidden1はこの層の出力
#1層目
hidden1 = tf.nn.relu(tf.matmul(images, weights) + bias)
#2層目
hidden2 = tf.nn.relu(tf.matmul(hidden1,weights) + bias)
#images, weights, bias, hidden1はいずれもテンソル
変数定義
変数の初期化
init.py
w = tf.Variable(tf.random_norml([784, 200], stddev = 0.35), name = "weights")
b =tf.Variable(tf.zeros([200], name = "biases")
#この変数を初期化する演算
#注意!ここではまだ実行されずノードが追加されただけである。
init_op = tf.initialize_all_variables()
#モデルを起動したあとで、この初期化を呼び出す
#定義したモデルはSessionで初めて動く。
#呼び出しには run を使用
with tf.Session() as sess:
# Run the init operation.
sess.run(init_op)
**変数の保存とリストア
save.py
#変数を作る
v1 = tf.variable(..., name = "v1")
v2 = tf.variable(..., name = "v2")
#変数を初期化する init_opノード
init_op = tf.initalize_all_variables()
#すべての変数をsave, restoreするsaveノードの追加
saver = tf.train.Saver()
#モデルを起動し、変数を初期化し、何かの仕事をしたあとで
#変数をディスクにsaveする
with tf.Session() as sess:
sess.run(init_op)
#モデルで何かの仕事をする
##########
#変数をディスクにsaveする
save_path = saver.save(sess, "/tmp/model.ckpt")
print("Modef saved in file: %s" % save_path)
#変数のrestore
saver.retore(sess, "/tmp/model.ckpt")
print ("Modell restored")
パラメータの最適化(訓練)
パラメータ(重みとバイアス)の最適化
- グラフを組んで、そのグラフで入力データで出力を計算
- 出力結果を正しい答えと比較。比較には損失関数を用いる
- Gradient Descent(勾配降下法)を使って、損失関数の値を小さく修正する
- 新しいパラメータで出力を計算。損失関数が小さくなるまで繰り返す
主な関数
GradientDescentOptimizer()
パラメータ最適化のための最適化演算。このOptimizerを使って損失関数を最適化
opt.py
###数値予測の場合###
loss = tf.reduce_mean(tf.square(y - y_data))
#学習率0.5で勾配降下
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
###クラス分けの場合###
y_ = tf.placeholder("float", [None , 10])
cross_enttopy = -tf.reduce_sum(y_ * tf.log(y))
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(cross_entropy)