カテゴリー「プログラミング」の4件の記事

2017年3月26日 (日)

Pythonと深層学習と

まったくもって今更ですが、世の中の流行から無視できなくなってきた深層学習を少し勉強して見ようと環境構築中です。

深層学習のおかげで、GPUはFP16の復活などこちらを意識したアーキテクチャの変化が起こりつつ、FPGAへの適用も各所で見かけるようになって来ました。Caffeなどのツール郡もいろいろと進化を遂げているようです。

実は、年初に体調を崩してしまい、人生初のプチ入院を経験したのですが、そのとき読んでいた本が

  ・深層学習-Deep-Learning-監修-人工知能学会

なのですが、恥ずかしながらさっぱり理解が追いつかず、ちゃんと基礎からやっておきたいなと。

やはり自分でプログラム書きながら理解を進める必要がありそうです。

で、郷に入れば郷に従え、ということで、素直にこの分野で一番使われている Python の勉強から始めてみました。
なるべく中身を解説してくれているサイトを探して、目標はとりあえず下記を理解することに。

http://qiita.com/kiminaka/items/9ae195739093277490fe

で、始めて早速嵌りました、Pythonでの環境作成に(笑)。

Pythonはプログラミング入門にも適しているので、その手の入門書も多いのですが、既にC++とかJavaとかの、オブジェクト指向プログラミングは知っていて、MATLABとかOpenCVとかそれ系のライブラリも使い慣れていて、とりあえず Python + Numpy で似たようなことがしたい、と言うだけだと、割と「環境づくり」が一番の罠だったように思います。

Python一日目でWindows な私としては、 easy_install とか pip とか wheel とか、その辺で「何それ???」状態で、どんどん時間を削られていってしまい、「いつになったらプログラミングはじめらるんだぁ~」となってしまうわけです(苦笑)。

  で、結論から言うととりあえず Anaconda 入れとく、というのが素人がとりあえず使うだけなら一番楽そうですね(賛否ありそうな雰囲気ですが)。
  もっとも OpenCV とかもコンパイルできる状態にするまでの罠が多いですので、やっぱり環境つくりは大切ですね。

  Pythonのバージョンは 2系と3系で、少し大きな変化があるようですが、とりあえずは言語的に難しいことはしない予定なのと、print が制御文から関数に変わった程度を知っていれば何とかなりそうなので、あまり気にしないで最新バージョンの3を入れてしまいました。

   Anaconda で 一緒にインストールされる、SpyderなるIDE環境を使うなり、Jupyter notebook なりを使うのが環境的に楽なようです。

  で、次にPython の文法のお勉強。
  こちらのサイトさんが個人的にはコンパクトに良くまとまってました。
  http://tohoho-web.com/python/index.html

  シンプルでよくまとまった言語ですね。他のプログラミング言語に知識があれば、文法自体は短時間で概略つかめますね。

  で、早速、Webのサンプルを打ち込んでみるわけですが、Python界の常識をいろいろ知らないのでまたもや嵌るわけです。

  Webにあるサンプルコードを打ち込んでもエラーしかでない。 Numpy という、いわゆる MATLAB的なライブラリを使う場合

  import numpy as np

  のような定義をしておくのが暗黙の了解のようです(フムフム)。

  他にも

from sklearn import datasets, linear_model

  とかも最初「???」 でしたが

   モジュール:ファイル
   パッケージ:ディレクトリ

  な理解と共に、雰囲気が掴めて来ました。

import matplotlib

  すれば、グラフが書けるのか、フムフム。
  でも
Jupyter notebook で、グラフが出ない、

  なるほど


%matplotlib inline

  が必要なのか(フムフム)。

なんとなく、こんな感じで格闘中です。


で、まあサンプルどおり動き始めましたが、どう理解したものか。

興味深いのが
隠れ層を1にした場合の下記の結果

Dl_hidden1


よく考えて見ると、

z1 = xW1 + b1

の計算って、n次元空間の平面の式に他ならないわけで(この例の場合は2次元なので直線の式ですが)、平面の法線方向に、活性化関数で尤度の割付をしている以上でも以下でも無いわけですよね(多分)。
隠れ層が1個のみの場合は、一次関数で勾配降下法で解いてるだけなので、最小二乗法的な解に落ち着くのは、まあ当然なわけです。

これを複数組み合わせていく以上でも以下でも無い中で、いろんな認識が出来てしまうというのはなんとも不思議な世界です。

ただ、身も蓋も無いことを言ってしまえば、ニューロン1個は NANDゲートの上位互換なので、「NANDゲートだけでどんな回路も作れる」ってのはまあそのとおりなのですが、問題はどう繋げば、目的の回路になるかだったりするわけです。
  そこのところは従来なら人間こその設計だったところに、自動的な最適化手法が出来上がりつつあるというのはなんとも奥深い世界ですね。

  うーん、ちゃんと理解できる日が来るのだろうか....

2015年5月 6日 (水)

続々・GPUのお勉強

前回からの続き。

計算を単精度に変えてみた。
画像の右上に三角形のつなぎ目で計算誤差で塗りつぶされない領域が出来てしまった。

Float
続けて、Q14で固定小数点にして見た場合。
Q14

ラスタライズによる塗りつぶし領域は正常になったが、テクスチャ座標でパースペクティブ補正が精度不足で悲惨なことに。
ラスタライズ演算後の座標は、あくまでピクセル数なので固定小数の方がトラブルが無いようだ。

一方で、除算の入る座標系は、単精度のままの方がよさそうだ。
(一応 Q20 ぐらいまで持っていくと正常にはなったが)。

FPGA化する場合、ステップサイズでインクリメントするとレイテンシが長いので、毎回乗算したほうがいいかもしれない。

(2015/07/25 追記)  普通に浮動小数点でステップ増加していくコア書けました。XILINXのIPカタログの浮動小数点コア使う場合は accumulator が使えますが、単純ステップ増加の場合は指数部のケア(仮数部の桁合わせ)が簡略化できるので、回路的には少しお得に出来るのではなかろうかと。

2015年5月 4日 (月)

続・GPUのお勉強

前回の続きです。

ようやく、OpenGL風に視点の指定など出来るようになってきて、パースペクティブコレクションの有無の実験だけ出来ました。

Photo

Photo_2

いろいろと感覚は掴めて来ましたが、さてどうしたものか。

ZyboにはDSPが80個ほどあったはずなので、単精度実数ぐらい実装できるかもしれないが、どのあたりを狙うべきか...

高位合成とか使うべきなんだろうなとは思いつつ(汗)

2015年5月 2日 (土)

GPUのお勉強

  将来GPUなんぞを実装して見たいと思いつつ、まずはGPUのお勉強がてら、古典的なレンダリングパイプラインを OpenCV上でプログラミング中である。

Render_test1
Render_test2

参考になったサイトなどを、備忘録的に残しておきます。

ラスタライザを作る人の古文書集
uimac実装メモ
https://www.opengl.org/sdk/docs/man2/xhtml/gluPerspective.xml
https://www.opengl.org/sdk/docs/man2/xhtml/gluLookAt.xml

githubにも入れてますが、まだ作り途中なのでそのうちURL張ります。