oikakerublogの日記

知識ゼロから色々しらべてみた話し

Tensorflow ORゲートのモデルの機械学習(詳解デープラーニング3章)

f:id:oikakerublog:20170708150244p:plain

◆目的:
・ORゲートの分離境界モデルを学習させる
・巣籠本(2017)の93ページ~

◆ORゲート
・いずれか一方の入力が1であれば、出力が1となる回路。

f:id:oikakerublog:20170717191625p:plain

・大まかな流れ

f:id:oikakerublog:20170717192051p:plain

◆実装:
(1)まずいつもの

import numpy as np
import tensorflow as tf

(2)パラメータの定義
・こんな感じ

f:id:oikakerublog:20170717193239p:plain

x = tf. placeholder(tf.float32, shape=[None, 2])
w = tf.Variable(tf.zeros([2,1]))
b = tf.Variable(tf.zeros([1]))
y = tf.nn.sigmoid(tf.matmul(x,w) + b)

tf. set_random_seed(0)#乱数シード

(3)学習のときに使うパラメータt

t = tf.placeholder(tf.float32, shape=[None, 1])

(4)誤差関数は交差エントロピー

cross_entropy  = - tf.reduce_sum(t * tf.log(y) + (1 -t) * tf.log(1-y))

(5)学習の式

train_step = tf.train.GradientDescentOptimizer(0.1).minimize(cross_entropy)

(6)予測

correct_prediction = tf.equal(tf.to_float(tf.greater(y,0.5)),t)

(7)X,Y

X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
Y = np.array([[0], [1], [1], [1]])

(8)初期化

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

(9)学習、200回まわす
・Tensorflowでは、Sessionで計算を実施

for epoch in range(200):
    sess.run(train_step, feed_dict={
        x: X,
        t: Y
    })

(10)学習結果の確認
・evalは発火/非発火の分類確認
⇔ tf.Variableの変数の値はevalでなくsess.run()で取得

classified = correct_prediction.eval(session=sess, feed_dict={
    x: X,
    t: Y
})
prob = y.eval(session=sess, feed_dict={
    x: X
})

print('classified:')
print(classified)
print()
print('output probability:')
print(prob)

(11)結果はこんな感じ↓
f:id:oikakerublog:20170717194926p:plain

・学習されたパラメータを確認
 縦ベクトルwの中の値2つが下記のように学習されたことが確認可能。

print('w:', sess.run(w))

→ w: [[ 3.61188436]
  [ 3.61188436]]

◆Memo:
・パラメータbの値…print('b:', sess.run(b))で確認できる。

◆キーワード:
ORゲート、分離境界、ランダム、乱数データ、学習率、学習されたパラメータの確認

** 以上 **

(2017.7.17.)