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)
        

f:id:Qitkun-000:20181025005134p:plain

前回とは少し結果が異なりますが、しっかり学習できてますね♪

では、さらに効率よく学習を進めるにはどのようにしたらいいのか・・・? そこで扱われるのが活性化関数ですね。 以下のサイトなんかとても分かりやすく乗っているので見てみると良いかも。

今回はその活性化関数の中の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)

f:id:Qitkun-000:20181128221054p:plain

さっきの結果に比べて、かなりの精度で学習できている✌︎('ω'✌︎ )

ReLU関数を使わないで学習させてみると・・・ f:id:Qitkun-000:20181128221709p:plain

学習率は圧倒的に違いますね(-_-)
活性化関数を用いる違いがよく分かりました。。。活性化関数すご・・・

今回は簡単にtensorflowを扱ってみました♪
次回は機械学習に便利なデータセットMNISTを使ってみましょう!