Tips by yumatsuge

Computer Scienceを勉強する大学4年生.Python、Chainer、Deep learning、機械学習、人工知能やubuntuの備忘録

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スクリプトになります。

python script version former numpy neural network

 

せっかく、Numpyを使ってコードを書いたので、

前回のfor文をぐるぐる回したコードと今回載せたNumpyを使ったコードの処理時間を比較してみました。(10回試行した平均値を算出)

  • for文を深くネストさせたコードの処理時間は8.51秒
  • Numpyを使ったコードは4.38秒

という感じでNumpyを使って書き換えたほうが約2倍の速度で処理を行うことができることがわかりました。

f:id:yumatsuge:20160816133751p:plain

さすがNumpy!はやいっすね!

必ずしもNumpyが速いわけではなく、append()など既存のリストを作り直す処理は遅い傾向があります。append()をfor文で回すくらいなら、

まずはfor文を使わなくて済むNumpyのメソッドを使うべきで、それが無理なら、最初にリストを作っておいて、値を代入していくだけの処理や、リスト内包表記を使ったほうが確実に処理速度が上がります。

今回は以上になります。

次回は今回のコードを変更して、Auto Encoderを作りたいと思います。

最後にJupyterで書いたときのコードを載せておきます。

reconstruct former 3 layer neural net applied to X ...