2017/04/07
0:00

TensorFlowによるニューラルネットワーク(コード解説)



みなさんこんにちは。人工知能ラボの助手です。

今日は、前にニューラルネットワーク概論①
記事に載せた、ニューラルネットワークのPythonコード
についてお話をしようと思います。



まずは、もう一度コードを見てみましょう。


#coding:utf-8

import tensorflow as tf
import math

#隠れ層のノード数
node = 30
#学習回数
training = 3000
#学習率
ln_r = 0.001

train_x = "学習用データセット(説明変数)を入れる"
train_y = "学習用データセット(目的変数)を入れる"

#データ数と説明変数の種類を取得
n, column = train_x.shape

#入力データ
x = tf.placeholder("float",shape=[None,column])
y_ = tf.placeholder("float",shape=[None,1])

#入力層から中間層への重みとバイアス
w1 = tf.Variable(tf.truncated_normal([column,node],stddev=0.1))
b1 = tf.Variable(tf.constant(1.0,shape=[node]))

#中間層の計算
h1 = tf.nn.relu(tf.matmul(x,w1) + b1)

#中間層から出力層への重みとバイアス
w2 = tf.Variable(tf.truncated_normal([node,1],stddev=0.1))
b2 = tf.Variable(tf.constant(1.0,shape=[1]))

#出力層の計算
y = tf.nn.relu(tf.matmul(h1,w2) + b2)

#2乗誤差を計算
loss = tf.reduce_sum(tf.square(y - y_))

#学習ステップ
train_step = tf.train.AdagradOptimizer(ln_r).minimize(loss)

init = tf.initialize_all_variables()

#セッション作成と変数初期化
sess = tf.Session()
sess.run(init)

#学習
for i in xrange(training):
    sess.run(train_step, feed_dict={x:train_x, y_:train_y})
    
    #学習100回ごとにデータ1件当たりの誤差値を表示
    if (i+1) % 100 == 0:
        print(math.sqrt(sess.run(loss, feed_dict={x:train_x, y:train_y}) / n))
基本的なTensorFlowの使用方法については、
TensorFlowによる回帰分析で解説したものと
同じですので、今回は回帰分析のときと異なる、
計算式の記述されている部分(27行目から35行目)
についてお話したいと思います。
 
ニューラルネットワークの各層での計算は、
基本的に行列計算になります。
 
今回であればまず、入力値のベクトルxに
重み行列w1(行数:xの数 列数:中間層のノード数)
をかけて、さらに活性化関数(今回はReLU)にかけます。
この計算を行うと、出力h1は要素数が中間層のノード数の
ベクトルになります。このベクトルの各要素が、中間層の
各ノードの出力です。
 
そしてこの第1層の出力ベクトルh1に重みベクトルw2をかけて、
さらに活性化関数にかけたものが出力y(今回はスカラ)
となります(わかりにくい場合は記事に載せた画像も見てみてください)。
 
これをコードに落としたものが27行目から35行目です。
TensorFlowで行列計算を行うときは、コードにもあるように
matmalメソッドを使用します。
 
あとは、回帰分析と同様に、教師データとの2乗誤差をとり、
勾配降下により学習を行っていきます。
 
また、重みが行列、バイアスがベクトルになりますので、
コードに書いてある(24,25,31,32行目)ように設定時に行数、列数
を指定します。
 
今回は中間層のノード数を30、出力層を1としましたので、
w1はxの要素数行30列の行列、b1は要素数30のベクトル、
w2は30行1列の行列(今回はベクトル)、b2は要素数1のベクトル
(今回はスカラ) で作成しています。 
 
 行っている計算の量は非常に多いですが、コードに
するとこのように行列計算を用いて、とてもシンプルに
記述することができます。
 
皆さんも、簡単なものでもよいのでぜひデータを用意して
プログラムを動かしてみてください。
 
それでは、今回はここらへんまでにしておきましょう。
 
次回は、サンプルのデータを用いて、
学習していく様子を実際に見て行きたいと思います。
 
では、お疲れ様でした!