Pythonによるニューラルネットワークの実装①

機械学習 Python R

Python でニューラルネットワークを実装してみましょう。何回かに分けて作っていきます。
第一弾の今回は、行列データを受け取って、0から9までの10種類のラベルを出力する、3層のモデルを作ります。行列パラメーターの更新機能は無く、手動で成分を設定してラベルを出力します。

Python の環境が無い人は、google colab を使えるようにしましょう。Pythonファイルに色々まとめて置くのが便利ですが、最悪一つのnotebook にまとめても良いです。
Google Colabolatory とニューラルネットワークの話はこちらの記事でどうぞ。

Google Colab によるpython環境構築
機械学習を始めるにあたって、環境を作るのが第一の壁になります。既に作られたライブラリが沢山あるので、python がオススメです。Google が提供するサービスを使うことで、python 環境が簡単に作れます。さらに、性能の良いパソコンを計算に使うことが出来るようになります。
ニューラルネットワークの話
ニューラルネットワークについての小話です。計算グラフを用いて、ニューラルネットワークモデルを表します。分類問題をニューラルネットワークで解く実験もしています。

ニューラルネットワークのモデルの実装は、以下の本を参考にしています。管理人はこの本でpythonがなんとなく書けるようになりました。

ゼロから作るdeep learning
機械学習記事のマサムネが読んでる本です

記事で使っているソースコードはgithub に置いてあります。
https://github.com/msamunetogetoge

使用するデータ

使うデータは Fashion MNIST という画像データです。10種類の衣類が\( 28 \times 28 \)の行列で表現されています。以下のような感じのデータです。

ファッションmnist
データのサンプル

実際のデータでは画像に対して、0~9の数字が割り振られています。単純に考えると、\(28 \times 28\)の数字から、0~9どのクラスに属しているのか当てる問題です。データを読み込むコードを以下に記します。
ただし、ちょっとした細工をしておきます。精度が上がるように画像は白黒に加工します。 また、画像データは\( 28 \times 28 \)の行列ですが、1つのデータが行列として与えられるのは、普段考える問題と違っています。いつも通りが一番なので、行列を1列のベクトルだと思いましょう。numpyのflatten 関数を使えばよいです。

今回実装するニューラルネットワークモデルの部分

作ろうとしているモデルは、入力層1層、隠れ層1層、出力層1層のモデルです。隠れ層では、relu関数で活性化し、出力層ではsoftmax関数で10個の値を得て最も大きい値を出すクラスを予測値とします。
パラメーターの更新は単純な勾配法で行い、誤差関数は交差エントロピーを使用します。
今回は、データを受け取って予測ラベルを出力し、正解率を計算する関数を作ります。具体的には、以下の機能が必要です。

  • 活性化関数(relu)の計算
  • 出力関数(softmax)の計算
  • 行列同士の積
  • 正解率の計算

ニューラルネットワークモデルの予測部分の実装

以下のグラフが示すモデルで予測値を得られるように、コードを書きます。

作ったモデル
作ったモデル

最終的には一つのクラスにまとめたいので、初めにクラスを作っておいて機能を増やしていきましょう。ニューラルネットワークのクラスとは別に、活性化関数や出力関数を作っておく必要があります。今のところは、reluとsoftmaxがあれば良いので、以下のように定義しておきましょう。

今回の目玉である、行列の計算と活性化関数の計算、そして出力関数の定義をしましょう。行列の行や列に気を付ければ簡単です。クラスにまとめたいので、TwoLayerNet というクラスの中に、行列の生成や ニューラルネットワークでの予測、正答率の表示を組み込みました。

この状態で、トレーニング画像からラベルを予測させてみましょう。全く訓練していないパラメーターなので、正答率は10%前後が妥当です。

正答率 5 %でした。パラメーターは適当なので正答率は何%でも良いのですが、無事にデータから予測値を得る関数を作ることが出来ました。次回からはpython上で作ったクラスに色々な関数を追加して、パラメーターの更新を自動で行ってくれるようにしていきます。

まとめ

・ Fashion MNIST という\(28 \times 28 \)の画像データがあり、10種類の分類問題に使える。
・計3層のニューラルネットワークモデルを作るために、クラスTwolayernet を作った。
・データに予測値を与える関数を作成した。
・pythonによるニューラルネットワークの実装➁はこちら
https://masamunetogetoge.com/make-neuralnetwork2

タイトルとURLをコピーしました