Numpyで作るXOR, Irisデータセットを分類するニューラルネットワーク
前回作成したニューラルネットワーク(Neural Network)はNumpyを使わず、行列積のような数学的演算はすべて深くネストされたfor文で処理していましたが、今回はその部分をNumpyで書き換えたコードを載せます。
今回よく使ったメソッドを以下にまとめておきます。
- numpy.zeros(): ゼロで満たしたベクトルの作成タプルを引数に渡せば行列を作成
- numpy.ones(): zeros()と似てて1で満たされた行列を作成。任意の値で満たした行列を作りたい場合は、np.ones() * hoge(なんかの値)でいける
- numpy.dot(): 行列積を計算。np.dot(a, b)やa.dot(b)として使える
- numpy.random.permutation():引数をN(int)とすると0からN-1までのランダムな順列を作成して返す。
- ndarray[index1, index2, index3]: 取ってきたいインデックスを入れるとndarrayの要素を返す。
python script version former numpy neural network
せっかく、Numpyを使ってコードを書いたので、
前回のfor文をぐるぐる回したコードと今回載せたNumpyを使ったコードの処理時間を比較してみました。(10回試行した平均値を算出)
- for文を深くネストさせたコードの処理時間は8.51秒
- Numpyを使ったコードは4.38秒
という感じでNumpyを使って書き換えたほうが約2倍の速度で処理を行うことができることがわかりました。
さすがNumpy!はやいっすね!
必ずしもNumpyが速いわけではなく、append()など既存のリストを作り直す処理は遅い傾向があります。append()をfor文で回すくらいなら、
まずはfor文を使わなくて済むNumpyのメソッドを使うべきで、それが無理なら、最初にリストを作っておいて、値を代入していくだけの処理や、リスト内包表記を使ったほうが確実に処理速度が上がります。
今回は以上になります。
次回は今回のコードを変更して、Auto Encoderを作りたいと思います。
最後にJupyterで書いたときのコードを載せておきます。