TensorFlowで実践ディープラーニング(その2)

多層構造型ニューラルネットワークを体験する

前回は、入力層と出力層しかない非多層構造型ニューラルネットワークについて実験しました。
今回は、非多層構造型ニューラルネットワークに隠れ層(Hidden Layer)を追加して、TensorFlowの多層構造型のニューラルネットワークを実験してみたいと思います。

では早速、前回使用したPythonコードを改良して隠れ層(Hidden Layer)を1層追加してみましょう。前回のPythonコードは、以下を参照してください。

TensorFlowのグラフに隠れ層を追加する

ニューラルネットワークのイメージは、以下の通りです。

では、前回のPythonコードを改良していきます。

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import tensorflow as tf

csv = pd.read_csv('iris.csv')
iris_class = {'Iris-setosa': [1,0,0], 'Iris-versicolor': [0,1,0], 'Iris-virginica': [0,0,1]}
csv["Name"] = csv["Name"].apply(lambda x : np.array(iris_class[x]))
csv_data = csv[["SepalLength","SepalWidth","PetalLength","PetalWidth"]]
csv_label = csv["Name"]
train_data, test_data, train_label, test_label = \
train_test_split(csv_data, csv_label, test_size=0.3, shuffle=True)
train_data = train_data.reset_index(drop=True)
train_label = train_label.reset_index(drop=True)
test_data = test_data.reset_index(drop=True)
test_label = test_label.reset_index(drop=True)

#重みとバイアスを設定する関数
def Weight_variable(name, shape):
  W_init = tf.zeros(shape)
  W = tf.Variable(W_init, name= name)
  return W

def Bias_variables(name, shape):
  b_init = tf.zeros(shape)
  b = tf.Variable(b_init, name= name)
  return b

#データフローグラフの作成
#データを入れるプレースホルダを宣言
x = tf.placeholder(tf.float32, [None, 4], name="x")
y_ = tf.placeholder(tf.float32, [None, 3], name="y_")
#変数宣言"
W1 = Weight_variable('Weight1', [4,4])
b1 = Bias_variables('Bias1', [4])
W2 = Weight_variable('Weight2', [4,3])
b2 = Bias_variables('Bias2', [3])
#1層目はシグモイド関数を定義
a1 = tf.nn.sigmoid(tf.matmul(x, W1) + b1)
#2層目はソフトマックス回帰を定義
y = tf.nn.softmax(tf.matmul(a1, W2) + b2)

#モデルの訓練設定
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(cross_entropy)
#正解率を求める設定
predict = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(predict, tf.float32))
#セッション開始
with tf.Session() as sess:
tw = tf.summary.FileWriter("log_dir", graph=sess.graph)
#初期化
sess.run(tf.global_variables_initializer())
#学習データを用いて学習する
fd = {x: train_data, y_: list(train_label)}
for step in range(30001):
  sess.run(train, feed_dict=fd)
  if step % 1000 == 0:
    cre = sess.run(cross_entropy, feed_dict=fd)
    acc = sess.run(accuracy, feed_dict=fd)
    print("step=",step,"cross entropy=",cre,"accuracy=",acc )
#テストデータを用いて正解率を求める
fd = {x: test_data, y_: list(test_label)}
acc = sess.run(accuracy, feed_dict=fd)
print('正解率=','{0:.2f}'.format(acc))

前回と異なる部分について説明します。

#重みとバイアスを設定する関数
def Weight_variable(name, shape):
  W_init = tf.zeros(shape)
  W = tf.Variable(W_init, name= name)
  return W

def Bias_variables(name, shape):
  b_init = tf.zeros(shape)
  b = tf.Variable(b_init, name= name)
  return b

隠れ層を追加するためには、隠れ層に設定する重みとバイアスの変数を追加する必要があります。今回は関数を定義しています。重みとバイアスには、名前と配列を引数に渡して、配列は「0:Zero」で初期化しています。実際に重みとバイアスを設定している箇所は、以下の部分です。

#変数宣言"
W1 = Weight_variable('Weight1', [4,4])
b1 = Bias_variables('Bias1', [4])
W2 = Weight_variable('Weight2', [4,3])
b2 = Bias_variables('Bias2', [3])

W1は入力層と隠れ層のノード数から4×4の配列を設定し、W2は隠れ層と出力層のノード数から4×3の配列を設定しています。また、b1は隠れ層のノード数を設定し、b2は出力層のノード数を設定しています。

#1層目はシグモイド関数を定義
a1 = tf.nn.sigmoid(tf.matmul(x, W1) + b1)
#2層目はソフトマックス回帰を定義
y = tf.nn.softmax(tf.matmul(a1, W2) + b2)

上記のコードでは、1層目にシグモイド関数を設定しています。また、2層目ではソフトマックス回帰を設定しています。tf.matmul()メソッドにそれぞれの層で与えられた入力値と重みを入力して行列の積を求め、それぞれの層でバイアスを加算します。

ここまでが前回との変更点になります。これで1つの隠れ層をもつ多層構造型ニューラルネットワークが完成しました。

ちなみにシグモイド関数は、以下のように縦軸が0~1の範囲のグラフです。詳しい説明は省きますが、シグモイド関数の出力結果は、確率や2つのクラス分類として取り扱うことができます。

多層構造型ニューラルネットワークのグラフの構造をみる

では、TensorBoardを使ってグラフのフローがどのように変化したか見てみましょう。

隠れ層に対応するWeight2とBias2がグラフ上に見て取れますね。では、実際にこのグラフを使って学習してみましょう。

多層構造型ニューラルネットワークでアヤメを学習する

次に、アヤメのデータを学習してみたいと思います。3万回の反復学習を行い、テストデータを使用して交差検証していきます。

step= 0 cross entropy= 1.09861 accuracy= 0.352381
step= 1000 cross entropy= 1.09764 accuracy= 0.352381
step= 2000 cross entropy= 1.09679 accuracy= 0.352381
step= 3000 cross entropy= 1.09495 accuracy= 0.352381
step= 4000 cross entropy= 1.09152 accuracy= 0.352381
step= 5000 cross entropy= 1.08545 accuracy= 0.333333
step= 6000 cross entropy= 1.07309 accuracy= 0.333333
step= 7000 cross entropy= 1.04756 accuracy= 0.52381
step= 8000 cross entropy= 1.00419 accuracy= 0.647619
step= 9000 cross entropy= 0.95384 accuracy= 0.647619
step= 10000 cross entropy= 0.913358 accuracy= 0.647619
step= 11000 cross entropy= 0.885024 accuracy= 0.647619
step= 12000 cross entropy= 0.864683 accuracy= 0.647619
step= 13000 cross entropy= 0.849016 accuracy= 0.666667
step= 14000 cross entropy= 0.835999 accuracy= 0.704762
step= 15000 cross entropy= 0.824472 accuracy= 0.8
step= 16000 cross entropy= 0.813809 accuracy= 0.847619
step= 17000 cross entropy= 0.803704 accuracy= 0.847619
step= 18000 cross entropy= 0.79403 accuracy= 0.87619
step= 19000 cross entropy= 0.784755 accuracy= 0.895238
step= 20000 cross entropy= 0.775892 accuracy= 0.904762
step= 21000 cross entropy= 0.767466 accuracy= 0.92381
step= 22000 cross entropy= 0.759499 accuracy= 0.933333
step= 23000 cross entropy= 0.751998 accuracy= 0.942857
step= 24000 cross entropy= 0.744963 accuracy= 0.952381
step= 25000 cross entropy= 0.738377 accuracy= 0.952381
step= 26000 cross entropy= 0.732222 accuracy= 0.961905
step= 27000 cross entropy= 0.726469 accuracy= 0.961905
step= 28000 cross entropy= 0.721092 accuracy= 0.961905
step= 29000 cross entropy= 0.716062 accuracy= 0.961905
step= 30000 cross entropy= 0.711352 accuracy= 0.961905
正解率= 0.96

3万回の反復学習では、正解率は96.19%まで向上しました。テストデータを使用した交差検証の正解率も96%となりました。

今回のまとめ

今回は、 Tensorflowの多層構造型ニューラルネットワークについて実験しました。比較的簡単に隠れ層を追加できることが理解できたとおもいます。

このように隠れ層(Hidden Layer)を増やすことを深化させると言います。また、深化させたニューラルネットワークのことをDeep Neural Network(DNN)と呼びます。

ディープラーニング(深層学習)は、「隠れ層が多数存在するニューラルネットワーク」と表現されます。この実験では、隠れ層を1層だけ追加しましたが、隠れ層をあともう1層追加すればディープラーニングになります。機械学習とディープラーニングの境目が理解できた気がしますね。

人工知能(AI)は、こんなにも身近な存在になっていて、今後は更にコモディティ化が進んでいくと考えられています。でも、人工知能(AI)の仕組みを理解すればするほど、人工知能(AI)が未だ不完全な技術であることに気付かされます。

人工知能(AI)は万能ではないため、今すぐ人間にとって代わることはできません。でも、人間の行動や思考を補助する道具と考えれば、現段階においても十分に優れた技術であることは言うまでもありません。

人工知能(AI)を活用した新しい未来社会を実現するために、私たちは人工知能(AI)やデータサイエンスに対して、正しい知識、技術及び倫理観を身に付けていかなければならないのです。