Tensorflowに触れてみよう
こんにちは。 前回numpyを用いて複数回学習させましたね。今回はTensolflowに触れて前回と同じように学習させて見ましょう。
動作環境
Mac OSX
pyenv
anaconda5.2(Python 3.6)
anacondaにTensorflowの環境がない方はこちらを参照して見てください。
Tensorflow
まあ、そもそもTensorflowってなんだよって話ですよね笑 以下のサイトとか他にも参考資料いっぱい転がってるので見てみるといいかも・・・
では前回のコードをTensorflowを用いて書き直して見ましょう。
#numpyをimport import numpy #tensorflowをimport import tensorflow as tf #重みを定義 w = numpy.array([ [0, 0.3, -0.8], [1, -1.2, 0.5] ]) # tensorflowで重みを定義する w_ = tf.Variable(w, dtype=tf.float32) # 前の層(入力層)からの出力値xを定義する x = numpy.array([ [5], [2], [7] ]) # xのplaceholderを定義する tf_x = tf.placeholder(tf.float32, shape=x.shape) # バイアスを定義する b = numpy.array([ [1.2], [3.4] ]) # tensorflowでバイアスを定義する tf_b = tf.Variable(b, dtype=tf.float32) # 目標値dを定義する d = numpy.array([ [1], [0] ]) # dのplaceholderを定義する tf_d = tf.placeholder(tf.float32, shape=d.shape) # tf_wとtf_xをかけ、さらにtf_bを足してtf_uを求める tf_u = tf.matmul(tf_w, tf_x) + tf_b # 二乗誤差Lossを求める tf_Loss = tf.reduce_sum(tf.square(tf_u - tf_d)) # 訓練コード(勾配降下法) train_op = tf.train.GradientDescentOptimizer(0.0001).minimize(Loss) #Session開始 sess = tf.Session() #変数の初期化 sess.run(tf.global_variavles_initializer()) #100回学習 for i in range(100): #学習の実行 sess.run(train_op, feed_dict = {tf_x : x, tf_d : d}) #誤差の取得 loss = sess.run(Loss, feed_dict = {tf_x, tf_d : d}) #10回に1度誤差を表示 if i % 10 == 0: print(i,":",loss)
前回とは少し結果が異なりますが、しっかり学習できてますね♪
では、さらに効率よく学習を進めるにはどのようにしたらいいのか・・・? そこで扱われるのが活性化関数ですね。 以下のサイトなんかとても分かりやすく乗っているので見てみると良いかも。
今回はその活性化関数の中のReLU関数を用いて学習させようと思います。
重み、バイアスの値も初期値を変えて見ましょう。
import numpy import tensorflow as tf #重みをランダムな値に変更 tf_w = tf.Variable(tf.truncated_normal([2, 3], stddev=0.1), dtype=tf.float32) x = numpy.array([ [5], [2], [7] ]) tf_x = tf.placeholder(tf.float32, shape=x.shape) #バイアスの初期値を0に変更 tf_b = tf.Variable(tf.constant(0, shape=[2], dtype=tf.float32), dtype=tf.float32) d = numpy.array([ [1], [0] ]) tf_d = tf.placeholder(tf.float32, shape=d.shape) #活性化関数 ReLUを使用 tf_u = tf.nn.relu(tf.matmul(tf_w, tf_x) + tf_b) tf_Loss = tf.reduce_sum(tf.square(tf_u - tf_d)) train_op = tf.train.GradientDescentOptimizer(0.0001).minimize(tf_Loss) sess = tf.Session() sess.run(tf.global_variables_initializer()) for i in range(100): sess.run(train_op, feed_dict={tf_x: x, tf_d: d}) loss = sess.run(tf_Loss, feed_dict={tf_x: x, tf_d: d}) if i % 10 == 0: print(i,":",loss)
さっきの結果に比べて、かなりの精度で学習できている✌︎('ω'✌︎ )
ReLU関数を使わないで学習させてみると・・・
学習率は圧倒的に違いますね(-_-)
活性化関数を用いる違いがよく分かりました。。。活性化関数すご・・・