今回は前回ご紹介したディープランニングを実際に開発ライブラリを利用して実装してみましょう。あまり馴染みのない方もいらっしゃるかもしれませんがgoogleが提供している開発環境があるのでそちらを利用してディープランニングを実例を通して学んでみましょう。さすが天下のgoogleといったところで誰にも使いやすく作り込まれているプラットフォームなのでプログラミングをされたことがない方でも簡単に最先端のツールを無料で利用することが可能です。ただし、アルゴリズムを細かく理解したい、アルゴリズムをご自身で構築したいという方は敷居がワンランク上がりますのでお手持ちないしはネットにある文献で適宜補填しながら学習していく方法を取るのがいいかもしれません。百聞は一見にしかずということで本記事と合わせてツールに触れることをお勧めします。
前回の記事をご覧になっていない方がいらっしゃいましたらこちらを先にご覧ください。
TensorFlow入門
『TensorFlow」とは、Google がオープンソースで公開している機械学習ライブラリーです。ディープラーニングをはじめ、いろいろな機械学習に利用できます。最初に基本的な使い方を紹介します。
TensorFlow とは?
TensorFlow(テンソルフロー、または、テンソーフロー)は、大規模な数値計算を行うライブラリーです。機械学習やディープラーニングが実践できますが、それだけでなく、汎用的な仕組みを提供しています。その名前に冠しているテンソルというのは、多次元行列計算のことです。Windows/macOS/Linux と各種OS で動かすことが可能です。TensorFlow 自体は、C++のライブラリーで作られていますが、Python/Java/Go/C 言語とさまざまな言語から利用可能です。そのライセンスは、商用利用可能のオープンソース (Apache2.0) となっており、企業や個人、研究機関を問わず自由に利用できます。機械学習のライブラリーとしては、人気が高く資料も充実しているのが特徴です。主に Python から利用されることが多いので、その資料の大半は Python を利用したものです。また、TensorFlow は数値計算を行う汎用的なつくりになっています。中には、画像関連のライブラリーもありますが、画像処理や音響処理を行う場合は、別途、画像処理に特化した OpenCVなどのライブラリーと組み合わせて使うことになるでしょう。
TensorFlow の Web サイト
[URLIhttps.:///www.tensorflow.org/
TensorFlow のインストールと動作確認について
TensorFlow のインストールについては、数多の文献が検索すれば出てくるのでお手数ですがそちらをご参照ください。また、正しく TensorFlow が動くかどうかは、以下のプログラムで確認できます。インストールが完了したら、Jupyter Notebook を起動しましょう(このとき、インストール前に起動したJupyter Notebo0ok は再起動する必要があります)。そして、以下のプログラムを実行します。
import tensorflow as tf
print (tf._version__)
正しくインストールできたら、以下のような実行結果が表示されます。
2:2.0
ジャンケンのルールを学習させてみよう
ここでは、簡単な例としてジャンケンのルールを学習させてみましょう。そして、ジャンケンの勝敗判定を行ってみます。ジャンケンのルールは単純なので、TensorFlow の使い方を覚えるのにぴったりの例題と言えます。最初にジャンケンのルールを記したデータを作成してみましょう。ジャンケンの手、グー、チョキ、パーをそれぞれ0、1、2と数値で表します。そして、ジャンケンの勝敗結果も、0: あいこ、1:負け、2:勝ちのように表します。それで、ランダムにジャンケンの勝敗データを作成し、データファイルに保存します。その際学習用とテスト用と合計 3000件のデータを作成します。
# ジャンケンデータを作成する
import pickle
import numpy as np
# ジャンケンの手と結果を定義(*1)
hands ={‘グー’:0,’チョキ’:1,’パー’:2}
results =[‘あいこ’,’負け’,’勝ち’]
# じゃんけんの公式を定義(*2)
Judge=lambda a, b: (а – b + 3) % 3
# ランダムにデータを作成(*3)
import random
random_hand= lambda : random.randint (0, 2)
x_items=[]
y_items=[]
for i in range (3000):
a = random_hand ()
b=random_hand ()
result =judge (a, b)
x_items.append ([a, b])
y_items.append (result)
# 作成したデータを表示
print (x_items)
print (y_items)
# データを学習用とテスト用に分割(*4)
x_train = x_items[0:2000]
y_train = y_items[0:2000]
x_test = x_items [2000:]
y_test = y_items[2000:]
# データを保存
items =[[x_train, y_train],[x_test, y_test]]
with open (“janken-data.pkl”, “wb”) as fp:
pickle.dump (items, fp)
プログラムを実行すると、「anken-datapkl」というファイルにジャンケンの手と結果の一覧を保存します。プログラムを確認してみましょう。(※1)の部分では、ジャンケンの手と結果を定義します。ジャンケンの勝敗は「(a-b+3) % 3」という簡単な計算で求めることができます。プログラムの(※3)の部分では、ランダムにジャンケンの手を決め、その勝敗結果を計算し、学習データx_tems と結果ラベルy_items に追加していきます。そして、(※4)の部分で学習用とテスト用に分割し、(※5) の部分で pickleを利用してPython のリそして、(※2)の部分では、ジャンケンの勝負を計算するラムダ関数を定義します。
TensorFlow でジャンケンを学習しよう
続いて、TensorFlow を使って作成したジャンケンデータを学習するプログラムを確認してみましょう。学習モデルを構築し、データを学習した後、実際に適当なデータを与えて正しく判定できているかを確認します。
v janken-train.py
import tensorflow as tf
import numpy as np
import pickle
# 保存したジャンケンのデータを読み込む(*1)
with open(“janken-data.pkl”, “rb”) as fp:
data = pickle.load(fp)
(x_train, y_train), (x_test,y_test)= data
# 学習モデルを構築(*2)
model = tf.keras.models.Sequential([
tf.keras.layers.Dense (30, activation=’relu’, input_dim=2),
tf.keras.layers.Dense (3, activation=’softmax’)
])
model.compile(optimizer=’adam’,
loss=’sparse_categorical_crossentropy’,
metrics=[‘accuracy’])
# 学習(*3)
model.fit(x_train, y_train, epochs=20)
# テストデータを評価(*4)
model.evaluate(x_test, y_test, verbose=2)
# 実際に勝負(*5)
def janken (a, b):
hands ={‘グー’:0,’チョキ’:1, ‘パー’:2}
results =[‘あいこ’,’負け’,’勝ち]
x = np.array([[hands [a], hands [b]]])
r = model.predict(x)
print (r)
print (a, b, ‘→’, results [r[0].argmax()])
janken(‘グー’,’グー’)
janken(‘チョキ’,’パー’)
janken (‘ パー’,’チョキ’)
プログラムを実行してみましょう。TensorFlow を利用したプログラムを実行すると、学習状況が逐次表示されます。ニューラルネットワークを用いた学習では、繰り返しデータを学習します。その繰り返し学習を経て、最適なパラメーターを決定します。TensorFlowの学習も、その過程がわかるように、繰り返し回数(Epoch) と損失(loss)と正確さ(accuracy) が逐次表示されます。それでは、プログラムを確認していきましょう。(※1)の部分では先ほど作成したジャンケンの手と(※2)の部分では、学習モデルを構築します。ここでは、単純なニューラルネットワークのモデルを構築しています。なお、TensorFlow では学習を実際に行う前に、どんなモデルを利用してニューラルネットワークを利用するのかを最初に指定し、モデルを構築(コンパイル)する必要があります。そのため、ここでも最初に変数 model にネットワークの構造を指定し、compile メソッドで構築し結果の一覧データを読み込みます。そして、(※3)の部分にあるように、構築済みのモデルに対して、実際の学習データ (x_train) と正解ラベル(_train) を指定し学習を行います。これまでの scikit-learn では見慣れない epochs というパラメーターを指定しています。これは、ニューラルネットワークで繰り返しデータを学習する回数です。ここでは 20を指定していますが、学習経過に表示される loss と accuracy を参考に回数を決定します。それから(※4)の部分で、学習したモデルを評価しています。ここでは 1000件のテストデータを評価します。正解率(accuracy) を確認してみると、1.0000(100%)と表示されます。
ところで、すでにテストデータより、ジャンケンのルールが正しく学習できることはわかっているのですが、(※5)以降の部分では、読者の皆さんが実際にジャンケンの手を指定して、ニューラルネットワークがジャンケンを判定できるのか試しやすいように janken 関数を作っています。(※5)のjanken 関数の第1引数には自分の手を、第2引数には相手の手を指定して実行してみてください。勝ジャンケンのルールを学習できているようです。敗を出力します。なお、(※5)の部分で predict メソッドの結果を確認してみましょう。この関数は、複数のデータを配列を与えると、各データごとの予測結果を配列で返します。ただし、その予測結果を見ると、[0.83456856 0.06101874 0.10441273]のように結果が配列で返されていることに気づくでしょう。これは、[あいこ負け勝ち]のそれぞれの値の確率を示すものです。確率がもっとも高いものがもっとも勝率の高い答えということになります。それで、実行結果は NumPy の array オブジェクトとして戻ってきます。そのため、argmax メソッドを用いることで、もっとも高い値を持つ要素番号を得ることができます。簡単なプログラムでargmax の動きを確かめてみましょう。Python のREPLで実行してみます。配列の要素の中でもっとも大きな値を持つインデックスを返す argmax メソッドの使い方がわかるでしょうか。TensorFlowを利用する場合には、argmax メソッドをよく使うのでマスターしておきましょう。
本当にジャンケンのルールを学習したのか考察しよう
ここまで見てきたように、機械学習ではプログラムを実行すると「数値が表示されて終わり」ということが多いです。そのため、一体何が行われたのかをしっかりと認識することが大切です。上記で紹介した30行程度のプログラムで、本当にジャンケンのルールをニューラルネットワークが学習できたのでしょうか。もちろん「できた」というのが答えですが、ジャンケンのルールは、簡単な一行の計算式でも求めることができます。しかし、このプログラムの中では、ジャンケンの計算式をまったく利用していないという部分がポイントです。つまり、計算式を与えることなく、計算結果だけを用いて、計算式と同等の処理を実現することができたのです。これから、いろいろなニューラルネットワークやディープラーニングのプログラムを紹介しますが、これらはいずれも、データだけを与えるものであり、そのデータの中にある規則を学習し、答えを導き出しているという点に注目してください。そこに、ニューラルネットワーク·ディープラーニングの面白さがあります。
グラフでモデルを確認してみよう
ところで、TensorFlow にはニューラルネットワークのモデルを視覚化するための便利なツールも用意されています。これを利用して、作成したデータを図で確認することもできます。先ほどのジャンケンのプログラムにコードを書き加えて、ニューラルネットワークのモデルを図で確認してみましょう。
import tensorflow as tf
import numpy as np
import pickle
# 保存したジャンケンのデータを読み込む
with open (“janken-data.pkl”, “rb”) as fp:
data = pickle.load(fp)
(x_train, y_train), (x_test,y_test)= data
# 学習モデルを構築
model = tf.keras.models.Sequential([
tf.keras.layers.Dense (30, activation=’relu’, input_dim=2),
tf.keras.layers.Dense(3, activation=’softmax’)
])
# モデルを構築
model.compile(optimizer=’adam’,
loss=’sparse_categorical_crossentropy’,
metrics=[‘accuracy’])
# モデルの概要を表示(*1)
model.summary()
# 図でモデルを出力(*2)
tf.keras.utils.plot_model(model, to_file=’janken-model.png’)
model.fít(x_train, y_train, epochs=20)
# テストデータを評価
model.evaluate (x_test, y_test, verbose=2)
プログラムを実行すると、以下のようなニューラルネットワークの構造を記した図(PNGファイル)を出力します。このジャンケンで利用したのは単純なニューラルネットワークなので、このように簡単なモデルが表示されますが、モデルが複雑な時、モデルの概要を理解するのに図の出力が役立ちます。
この節のまとめ
・TensorFlow はディープラーニングを実践するライブラリーのなかで人気が高い
・TensorFlow ではモデルを定義し構築してから学習を行う
・モデルを図で出力する機能が備わっている
いかがでしたでしょうか。Googleにこのようなコンソール付きのディープランニングに特化したサーバー付きプラットフォームがあることに驚いた方も多いのではないでしょうか。そして行なっていることは基本的に既習事項で学んだことの応用なので理解もしやすかったのではないでしょうか。
たとえわからなかったとしてもプログラミングにカンニングしてはいけないというルールはないので、基本に立ち返って繰り返し安心してプログラミングに触れてください。何度もこの工程を繰り返すことで気づくと皆様の頭の中にプログラミングに関する膨大な知識が記憶として蓄積され何もみずともプログラミングできるようになっているはずです。今の私もあれなんだっけとネットの文献を調べてはコーディングを行なっている最中で、常に答えを見ていいのがプログラミングであることを念頭に留めて諦めずプログラミングを物にするまで学習を継続していただけると幸いです。