ソフトウェアエンジニアの勉強ログ

興味があるのは、computer vision, three.js, python, 深層学習, emacs

深層学習の超基礎知識を勉強した(パーセプトロンからニューラルネットによる推論まで)

  • ゼロから作るDeep Learningの2〜3章を読んだ
  • ここまでは簡単で、基本的にpythonで手を動かす練習をしているだけ
  • パーセプトロンで、OR, AND, NANDを作れる
    • それを二層にすることで、XOR(非線形)を作れる
  • 深層学習で、層を重ねて非線形の問題を解くためには、活性化関数を非線形にする必要がある
    • 言われてみると当たり前
    • シグモイド関数とかReLU関数とか
    • ReLUの方がよく使われているだろうか?
  • pythonでは、A * Bが行列の内積ではないことに注意。以下のように記述する必要がある。
    • np.dot(A, B)
  • ニューラルネットワークで、実際に推論してみる
    • お馴染みのMNISTデータ
    • 簡単にデータをロードできてよかった
      • 機械学習を使おうとすると、ほとんどこの辺のデータ準備の作業ばかりになりそうで怖い
  • 層の計算は、行ベクトルと行列の内積で算出できる
  • pickleは絶対便利
    • オブジェクトは'wb'で書き込んで、'rb'で読み込む
data = {}
data['name'] = "hoge"
...

with open(file_name, 'wb') as f:
  pickle.dump(data, f)

で保存して、

with open(file_name, 'rb') as f:
   data = pickle.load(f)

で読み込む。

  • 時間測定は、timeをimportすれば良い
start = time.time()
...
end = time.time()
print(str(end - start) + "[sec]"

時間は秒のようだ。

  • batch処理に関して
    • 要するに、1データが行ベクトルだったものを、複数データを行列とすることで、まとめて計算を行って高速化する
    • 簡単に10000テストデータで時間計測したところ、
      • バッチサイズを100とすることで、処理時間が10倍速くなったが、その後、バッチサイズを1000や10000にしてもほぼ同じだった
    • バッチサイズは大きければ大きいほどよいというものでもないようだ