0:00
みなさんこんにちは。人工知能ラボの助手です。
今日は、前にニューラルネットワーク概論①の
記事に載せた、ニューラルネットワークの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のベクトル
(今回はスカラ) で作成しています。
(今回はスカラ) で作成しています。
行っている計算の量は非常に多いですが、コードに
するとこのように行列計算を用いて、とてもシンプルに
記述することができます。
皆さんも、簡単なものでもよいのでぜひデータを用意して
プログラムを動かしてみてください。
それでは、今回はここらへんまでにしておきましょう。
次回は、サンプルのデータを用いて、
学習していく様子を実際に見て行きたいと思います。
では、お疲れ様でした!