2015年10月8日

[hw]感圧センサを買いました

感圧センサを買ったのだ。

スイッチサイエンスさんで購入。
いつもお世話になっております。

角型のセンサ
http://ssci.to/334
image

丸形のセンサ
http://ssci.to/270
image

なお、下の黒いものは、Nexus5です。

角型の黒い四角や、丸形の黒い丸の部分に少し厚みがある。
厚みといっても、そうねぇ、NFCカードよりも薄いくらいと思ってもらえばよいか(わかりづらい?)

アナログテスタを抵抗測定にして黒いところを押すと・・・おお、抵抗値が下がる!
こういう、動きに直結したセンサは楽しいですな。


さて、なんで感圧センサを買ったかというと、これの続きなのだ。
hiro99ma blog: 座っているかどうか知りたい
けっこう、私は長い時間座っている方だと思う。
仕事時間も長いし、あまりトイレに行ったりもしないし。
来月からはほとんど自宅で仕事するようになる予定だから、自分にセンサを取り付けて、座っている時間というか、立っていない時間を調べようと思うのだ。

うちは、こたつ生活なのだが、今度ようやく作業用のデスクも買うことになった。
だから、座っているといっても、デスクかこたつかと、いろいろある。
立っているときは、ほぼ体重が足の裏にかかるはず。
それ以外の場合は、立っていないはず。
そういう想定で、自分が立っているかどうかを調べられるんじゃないか、そんな気がしている。
さあ、うまくいくかな?

2015年10月7日

[caffe]モデルって?

うちのVirtualBox上xubuntu 14.04でcaffeが動くようになったと思うが、今になってインストール方法を見つけた。
Ubuntu 14.04 VirtualBox VM · BVLC/caffe Wiki
CUDAってGPUを使うための何かだろうけど、VirtualBoxから使えるんだねぇ。
と思ったら、Makefile.configで結局CPU_ONLYを1にしてるな。。。

あとは、classify.pyに--print-resultsを付けるようにしてるが、これはclassify.py自体にも変更がいるみたいだ。
せっかくだから本編にも入っているといいのに。

ちょっと気になったのが、modelsのダウンロード。
get_caffe_reference_imagenet_model.shがないから落としてきたのだが、どうもスクリプトがあるみたいだ。
まだダウンロードしていないgooglenetを試してみよう。

$ ./scripts/download_model_binary.py models/bvlc_googlenet

うん、bvlc_googlenet.caffemodelがダウンロードできた。
本当はyamlがないということで「sudo apt-get install python-yaml」をやったのだが、まあ細かいことはよかろう。


そこで思ったのが、モデルって何だろう?だ。
「深層学習」の目次を見ると「モデル平均」しかない。
モデル平均はDeepLearningやニューラルネットワークだけの話じゃなくて、機械学習一般の話らしい。
1種類の識別モデルじゃなくて、複数組み合わせた結果の平均を採った方が精度が上がる、みたいなことのようだ。

なので、caffeでいうところのモデルは、ニューラルネットワークの層だとか重みとかで、bvlc_googlenetだったらgooglenetの画像(というのがあるか知らんが)で学習させたときのパラメータ一式、bvlc_reference_caffenetはまたそういう学習させたときのパラメータ一式、ということだろうか。

あー、でも重みまで入ってるんだったら、ilsvrc12のtrain.txtとかはいらないはずだ。
だから、そこまではモデルには含んでないで、ネットワークの作りだけだろうか。
うーむ。

caffeでモデルというと、Caffe | Model Zooが出てくる。
カフェなのに動物園だなんて。。
ワインだったらワインセラーとかになったのだろうか。
Model Zoo自体は、モデルじゃなくて、モデルを共有するしくみのようだ。

日本語に訳された方
OpenCV 備忘録: Caffe のモデル配布に関して訳してみた

目次に「学習済みモデル」とあるから、やっぱり学習も関係あるのか?
O'Reilly Japan - Caffeをはじめよう

p.13に"Share Your Models!"とあるので、共有できるものらしい。
https://docs.google.com/presentation/d/1UeKXVgRvvxg9OUdh_UiC5G71UMscNPlvArsWER41PsU/preview#slide=id.gc2fcdcce7_216_101


caffeだけの言葉でもなさそうなので、機械学習でのモデルを調べてみよう。

「モデルのトレーニング」
機械学習とは何か? – 機械学習の定義と使える言い回し | コンピュータサイエンス | POSTD

「予測モデル」という言葉が出てくる。
機械学習を用いた予測モデル構築・評価

これも「予測モデル」で、作成できるものらしい。でも「アルゴリズム」という言葉も出てくる。
Google Prediction API - データ分析と予測 API — Google Cloud Platform

「モデルの分割」??
第21回(最終回) 機械学習 はじめよう:機械学習 はじめよう|gihyo.jp … 技術評論社

 

知らない分野の知らない言葉をネットで検索するというのは、恐ろしいことだな。。
調べる内容がどんどん発散していくのが自分でもわかる。
でも、最後に調べた技術評論社の記事は、今読んでる「深層学習」に書かれていない基礎知識を把握する意味でもわかりやすそうだ。

そしてここに、モデルについて書かれていた。
第1回 機械学習 ことはじめ:機械学習 はじめよう|gihyo.jp … 技術評論社
おお! そういうことか(引用は禁止なので)!!

 

ディープラーニングは、別にぽっと出のものではなく、あーでもないこーでもないと多数の人が研究した中の1つだと思う。
なので、もっとよいものは今後出てくるだろうし、もしかしたら「ディープラーニングは局所解で、○○を××すると△△法が一番よかった」みたいなことになるかもしれない。

[ai]Caffeの画像分類を説明しているサイトをなぞる

インストールしたら、まずは動かしてみたいと思うのが人の常。
サンプルが用意してあり、日本語で使い方を書いてくださってる方も多いので、見ながらやってみる。

Caffeで手軽に画像分類 - Yahoo! JAPAN Tech Blog
こちらは、examples/imagenetにあるサンプルを動かすようだ。
が、今のバージョンでは(かどうかもわからんが)、get_caffe_reference_imagenet_model.shが無い。

  • create_imagenet.sh
  • make_imagenet_mean.sh
  • resume_training.sh
  • train_caffenet.sh

caffe/examples/imagenet at master · BVLC/caffe
上から順にやっていけばよさそうだ。
「Training ImageNet」の1番目のコマンド(caffeの次がtrain)になってるのが、train_caffenet.sh。
「Resume Training?」のコマンドがresume_training.shになっているようだ。


まず、データの準備。
caffeをビルドしたディレクトリに移動し、

$ ./data/ilsvrc12/get_ilsvrc_aux.sh

これで、何かダウンロードし始めた。
caffe_ilsvrc12.tar.gzをwgetで取得し、tarで解凍するだけのスクリプトだ。

「ilsvrc12」って、なんだろうね?
ImageNet Large Scale Visual Recognition Competition 2012 (ILSVRC2012)
なるほど、ImageNetというのがあり、規模の大きな(Large Scale)画像認識(Visual Recognition)チャレンジ(Challenge)の2012年版、ということかな。
Challengeがうまく解釈できないけど「この画像たちを見事認識してみよ」みたいな挑戦ってことかしら。
今は2015年版があるようだ。

解凍されると、ファイルが8つあった。
画像がいっぱい入っているのかと思ったけど、そうではない。

  • det_synset_words.txt
  • imagenet.bet.pickle
  • imagenet_mean.binaryproto
  • synsets.txt
  • synset_words.txt
  • test.txt
  • train.txt
  • val.txt

大きいのはtrain.txtとimagenet.bet.pickleで、train.txtは44MBちかくある。

そしてexamples/imagenet/create_imagenet.shを実行したのだが、JPEG画像がないないとずーーーっとエラーを吐き続けた。。
githubの方のImageNetサンプルの説明の最初の方に「あなたは既にImageNetトレーニングデータと検証データをダウンロードしてあるとします」とあり、JPEGファイルが置かれている想定になっているようだ。

256x256にサンプリングするときだけのような気もしたが、ilsvrc12_train_leveldbとilsvrc12_val_leveldbがコマンド実行前にあるとダメ、と書いてあるので、その両者がないとダメなのだろう。
make_imagenet_mean.shにもそのパスが書いてあるし。

 

Caffe+AlexNetでImageNet2012を学習してみた (1) - 下丸子のコネクショニスト
こちらを読むと、ImageNetに申請してデータを入手した、とあった。
でも、Yahoo!のブログでやってる手順を見ると、そんなのはなさそうだ。
もしかすると、get_caffe_reference_imagenet_model.shというスクリプトがそれをやっていたのかもしれない。
記事から1年経ってるから、いろいろ変わったのかもしれない。

CaffeのImageNetで特徴量抽出器を動かすまで - About connecting the dots.
非常にありがたい。
そうか、いろいろダウンロードがいるのですな。


どうも、imagenetのサンプルは、自分で画像を用意してトレーニングさせるサンプルのようだ。
そのサンプルデータとしてImageNetのデータを使うから、あれこれダウンロードがいるのだろう。

それより前に、既にあるものを使って動くのかどうかを見てみたい。
というわけで、またYahoo!ブログの内容に戻ろう。

こちらは、先ほどのリンク先からデータさえ取ってきておけば使えそうな気がする。
例がpythonなので、そこら辺もインストールしよう。

$ make pycaffe
$ cd python
$ for req in $(cat requirements.txt); do pip install $req; done

そしてコマンドを動かしたのだが、skimage.ioがないとか言われる。
Download — scikit-image
$ pip install -U scikit-image
インストール中に、scipyがないと言われる。
Installing the SciPy Stack — SciPy.org
けっこう時間がかかる・・・。ここで"Anaconda"という単語を見て、CaffeのインストールページにもAnacondaって書いてあったのを思いだした。
どうも、Anaconda Pythonというpythonが入っていると、あんまり大変じゃないらしい。
アナコンダっていわれても蛇くらいしか思いつかないよなあ、とも思ったが、そもそもパイソンも蛇か。

終わって、再びsckit-imageをpip。
scipyほどではないが、これも時間がかかる。。。あ、エラーだ。
sudoが・・・いるのね・・・。
これでコマンドを動かすと、今度はgoogle.protobuf.internalがない、と。
$ sudo pip install -U protobuf

またコマンドを動かすと、今度はランタイムエラー。bvlc_reference_caffenet.caffemodelがない、と。
FPGAの部屋 2015年02月03日
やはり先人がおられるものだ。
githubで該当するmodelのフォルダに移動すると、ダウンロード先のURLが書いてあった。
こういうしくみですか。。。
ダウンロードしているが、これもかなり時間がかかりそう。

2時間くらいかかった。
今度実行すると、こういうエラーになった。

ValueError: Mean shape incompatible with input shape.

助けて、百太郎(もう疲れてきてる。。)!
OSX10.10でCaffeをインストール、リファレンスモデルで画像を分類 - Qiita
バージョンによっては、caffe/python/caffe/io.pyがそういうエラーを出すとのこと。
さて、なんのバージョンなのだろう。Caffe? それとも他のツール?

io.pyは400行もないファイルだ。
私が動かしたときは、これのL.255でエラーになっている。
pythonはわからんが、raiseがthrowかexit()みたいな役割なのかな。
ということは、ms != self.inputs[in_][1:]という条件を満たしたということだ。
msは、mean.shape。
ソースコメントによると、meanはndarrayのmean(平均?)、in_はこのmeanへの入力のようだ。
ndarrayはn次元配列?
len(ms)は3じゃないとダメらしい(2だと補正している?)。画像は縦×横×画素値、ということで3なのかなぁ。
それとも、画像が何枚もあるから3次元としているのか。。
で、今回出ているエラーはそれもくぐり抜け、self.inputs[in_][1:]と不一致だから発生している。
self.inputsは、そういうメンバ変数がいるのだろう(io.pyのコンストラクタで与えられているみたい)。
[1:]は、配列の1番目以降(0始まり)、という意味らしい。
ms[0]とself.inputs[in_][1]が一致するのはその前に確認しているから、全体として違う、ということか。

そもそも「違う」って、何が違うんだろう?
Cだとmemcmp()とかで比較しない限りはアドレスの一致だけしか見ないけど、stackoverflowのを読んだ感じでは画像のサイズが違うから一致してない、といっているような気がする。つまり、要素数の不一致。
エラー出力も「mean画像とinput画像に互換性がない」だし。

imagenetサンプルの説明でも、ImageMagickで256x256に変換してどうたらこうたらと書いてあったので、テスト画像を256x256にしてみたらどうだろう?
$ convert -resize 256x256\! ../examples/101_ObjectCategories/airplanes/image_0001.jpg ./image_0001_256x256.jpg
$ python classify.py --raw_scale 255 ./image_0001_256x256.jpg ../result.npy
・・・うん、同じエラーだった。

いや、説明に書いてあったconvertするのは、元画像の方だったはずだ。
256x256に正規化してからトレーニングするとか、そんな話だろう。
ということは、元画像のサイズはばらばらだから、それごとに画像サイズを合わせる、というのがstackoverflowに書いてあることなのか。

というのを理解して、OSX10.10でCaffeをインストール、リファレンスモデルで画像を分類 - Qiitaの修正内容を反映させた。

$ python classify.py --raw_scale 255 ../examples/101_ObjectCategories/airplanes/image_0001.jpg ../result.npy
・・・
Done in 2.06 s.
Saving results into ../result.npy

ようやく出力された。
長かった・・・。


できたresult.npyはテキストファイル化と思ったが、さらに加工しないと人間が見てわかりづらいらしい。
こちらは、Yahoo!ブログに書いてあるshow_result.pyを使うとよろしい。

$ python show_result.py ../data/ilsvrc12/synset_words.txt ../result.npy
#1 | n04552348 warplane, military plane | 84.8%
#2 | n04008634 projectile, missile |  5.5%
#3 | n02690373 airliner |  5.1%

お、ブログに書いてあるのと同じ結果だ。

というわけで、自力で解決できたところは何もなかったけど、「とりあえず動かす」ということだけはできた。
しかし、最後に変更したとこなんかはshapeと書いているだけに、画像認識が強そうに思う。
でも、Caffeだってフレームワークだし、入力と結果さえ定義すれば画像以外にも使えるはずだと思っている。
まあ、その場合にはトレーニングされたデータというのは使えなくなるが・・・。

 

本の「深層学習」は、ようやく4章に入った。
ええ、理解できているとは到底言えませんが。
とりあえず、今までは順伝播型ネットワークということで入力から出力までが一方向だったけど、誤差を逆方向に伝えるようにすることで計算量が減らせるよ、ということらしい。
なんか、こういう適当すぎる把握しかできなくて、著者に申し訳ない・・・。

2015年10月6日

[ai]Caffeをインストールしてみよう

深層学習はちょっとお休みして、Caffeをインストールしてみよう。
Caffe | Installation
偶然、うちのVirtualBoxに入っているXubuntuが14.04なので、環境は悪くなさそうだ。
(Hostは、Windows7 64bit)

※注意※
次の段に書いてますが、Ubuntuでのインストール手順がちゃんと書いてあるので、そっちを参考にした方がよいです。

atlas package : Ubuntu
$ sudo apt-get install libatlas-base-dev

boostのインストール - C++入門
$ sudo apt-get install libboost1.55-dev libboost1.55-tools-dev
※これはインストールせず、後述のUbuntu用インストールをやった方がよい

jayrambhia/Install-OpenCV
ZIPを落としてきて、展開。
$ cd Ubuntu
$ ./opencv_latest.sh

protobuf package : Ubuntu
$ sudo apt-get install libprotobuf-dev

glog?
どうやるんだ??


というところまでやって、「glog ubuntu」で検索すると、CaffeをUbuntuにインストールするときの手順が出てきた。
Caffe
ああ、そういう親切なページがあったのね。。

インストールして無さそうなものをapt-getして、ようやくCaffe本体をcloneした。
$ git clone https://github.com/BVLC/caffe.git

そしてコンパイルだ。
$ cp Makefile.config.example Makefile.config

ここで自分の環境にMakefile.configを編集するらしい。
VirtualBoxだとGPUが使えない気がするので、CPU_ONLYのコメントを外そう。
そして!
$ make all
・・・エラーになった。boost周りっぽい。
普通にapt-getすると1.54だったから別の方法でインストールしたんだけど、Ubuntuインストールの説明に従った方がよいのだろうか?

$ sudo apt-get remove libboost1.55-dev libboost1.55-tools-dev
$ sudo apt-get install --no-install-recommends libboost-all-dev

なんか、opencvも怒られるみたい。
でも、libopencv-devをapt-getしても変わらなかった。
うん、こういうときは、Makefile.configからUSE_OPENCVをコメントアウトして、0を設定しよう。
$ make clean
$ make all
うむ
$ make test
うむうむ


OpenCVを組み込めなかったのは残念だが、そこは必要になったら考えよう。
今必要なのは、どうやったらこれで遊べるの?なのだが、そこは後日に。

[2015/10/07追記]
OpenCVでエラーになったのは、Makefile(Makefile.configではなく)へのライブラリ追加で対応できるようだ。
https://github.com/BVLC/caffe/issues/2288

ifeq ($(USE_OPENCV), 1)
    LIBRARIES += opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs
endif

インターネット様様である。

image

2015年10月5日

[ai]『深層学習』を読む (4)

3章まで読み進んだ。

2章までは確率とか公式とかが多くてなかなか読み進まなかったのだが、3章は数式というよりもテクニックのようなものが多かったので、「ふーん、そうなんだ」で読み進めてしまった。
確率でどうのこうのという話をしていたが、じゃあどうやって事後確率を高めるのか、ということを考える章だと思う。

理論は伴わないけどノウハウとして知られていて、それで効果も上がる、みたいな方法が説明してあり、こういう数学っぽい分野でそういうものもあるんだ、というのが面白いところだ。


そして、だんだんと「調べたことをどうしようかね」と思うようになった。
実装してみるというのもよいのだろうが、ブログなどを見ている感じではオープンソースのフレームワークを利用する、というのがよさそうな気がしている。
だってね・・・難しそうだし、実装が間違っていても気付かなさそうだし。
悔しいが、負けを認めよう。

有名なフレームワークはいくつかあるらしいが、最初に出てきたこれを見てみよう。
Caffe | Deep Learning Framework
画像分類には興味ないのだけど、みんな楽しそうに分類しているので、デモを試してみた。

image

ヘルメットね、うん。
なんとなく、わからなくもない。
いくつか自分の描いた画像を試したけど、デフォルメしたようなものはクラス分けがうまくいかないようだ。
まあ、写真がいいんだろうね(私は写真をあまり撮らないので、いいのがなかった)。

インストールは、ここのようだ。
Caffe | Installation
計算をたくさんするためか、GPUで動かすモードもあるみたい(CUDA、というのがいる)。
OpenCVもいるというのは、やはり画像が強いのかいな?
本では「たたみ込みニューラルネット」というのが画像認識によく使われると書いてある。

どうせ本を読んでいる間はPCが遊んでいるので、インストールしてみますかね。

[ai]『深層学習』を読む (3)

まだ、昨日のページから進んでません。。
「条件付き確率の定義」が気になってしまいまして。

教科書ではp.6と最初の方にあったから、そのくらいまでのページは読んでおこう、と読み進めたものの、「確率の定義」で悩んでいた。

σ集合族、というものについて。
確率論と集合論は似たような用語というか、同じようなものを扱うらしい。
「確率が半分」だった場合、「その範囲はどこからどこまで?」とか「どれを確率と関係するとかしないとか決めるの?」のような定義をしましょう、ということが書いてある。

まず、「全体」がある。教科書ではΩで表してある。
これは「全体の集合」という意味。
それに対して、部分集合がある。Ωの一部ですな。

全体は1つしかないけど、部分集合はいくつでもパターンが考えられる。
なので、部分集合の集合、というものも考えることができる。
これを「集合族」と呼ぶそうだ。
Ω内の個々の要素いくつかをまとめたものが「部分集合」で、部分集合をいくつかまとめたものが「集合族」。
ここまでは、だいたいわかったつもり。

で、その次に「σ集合族」という言葉が出てくる。
以下の条件を満たすと、σ集合族らしい。
集合族の名前?をB(教科書ではフラクトゥールの書体になってる)とすると、

  1. Ω∈B
  2. A∈B⇒Aの補集合∈B
  3. A,, A2, ..., An, ...∈B⇒Anの和集合∈B

数式エディタとかないと、ちゃんと表現できんな・・・。
たぶん、言葉としては以下と同じことなんじゃないかと思う。
https://ja.wikipedia.org/wiki/%E5%AE%8C%E5%85%A8%E5%8A%A0%E6%B3%95%E6%97%8F#.E5.AE.9A.E7.BE.A9.E3.81.A8.E6.80.A7.E8.B3.AA

1番目は、わかる。BがΩに属する、ですな。
3番目も、わかる気がする。それぞれがBに属していたら、その和集合もBに属している、と。
2番がぴんと来なかった。AがBに属しているんなら、Aの補集合は属してないんじゃないの?と。

調べていたら、ここがわかりやすかった。
ときわ台学・ルベーグ積分
ここのβというは、上のBと同じ意味のようだ。
私が疑問に思っていたことは、1章の[2]に実例で書いてある。
集合族Bというのは、部分集合の集合の一部じゃなくて、全部の部分集合の集まりなのだ。
だから、Aという部分集合もあるし、Aの補集合という部分集合もあるのだ。


そしてようやく、条件付き確率についてだ。

P(A | C) = P(A ∩ C) / P(C)

定義式はこれだけ。
P(A | C)というのが「Cという条件があるときのAの確率」みたい。
縦線だとORみたいだけど、縦線の右側が左側の説明をしているようだ。
これだと、AはCという集合の一部だ、みたいな見方でよいのかな。
教科書にはベン図が載っていて、「Aの丸」と「Cの丸」があり、それが交わっている。
その交わった部分がP(A | C)になる。

image

数式はともかく、図としてはわかった。

もう1つ、条件付き確率の説明の近くに重要な公式があった(教科書に赤ペンでマークしているので)。
これが「ベイズの定理」で、こういう式だ。

P(Aj | A) = P(Aj) P(A | Aj) / sum( P(Ai) P(A | Ai) )

ここでの前提は、Aiは部分集合族で、Aiの領域は重ならず、全Aiの和集合は集合の全体(Ω)、だ。
実は、ベイズの定理より前に「全確率の公式」の説明がある。
ベイズの定理と同じ前提条件の時、以下が成り立つとのこと。

P(A) = sum( P(Ai) P(A | Ai) )

これは、ベイズの定理の分母と同じだ。
条件付き確率の定義式と、この全確率の公式から、ベイズの定理が導き出せる。

P(A | C) = P(A ∩ C) / P(C)    ・・・条件付き確率
P(A) = sum( P(Ai) P(A | Ai) )   ・・・全確率の公式

まず、条件付き確率のAをAjに、CをAにする(AjはAの一部)。

P(Aj | A) = P(Aj ∩ A) / P(A)

P(A)を全確率の公式にする。

P(Aj | A) = P(Aj ∩ A) / sum( P(Ai) P(A | Ai) )

あー、もう1つ公式があった。
「乗法公式」というもので、

P(A1 ∩ A2 ∩ ... ∩ An) = P(A1) P(A2 | A1) ... P(An | A1 ∩ A2 ∩ ... ∩ An-1)

というもの。
これを分子に当てはめて、

P(Aj | A) = P(Aj) P(A | Aj) / sum( P(Ai) P(A | Ai) )

うーん、もう訳がわからなくなってきた。。。

Wikipediaを見てみよう。
概要の説明がわかりやすい。
事後事後いっていたが、事前確率は縦線がないP(A)、つまり、ふつーの確率。
Aの後のBの確率が、事後確率とか条件付き確率とかいう呼び名でP(B | A)。
事後確率は、事前確率P(B)をP(A)で割った値に P(A | B)を掛けた数字で出てくる。
って、P(A | B)も条件付き確率やん!

と思ったら、こっちは「尤度」と書いてある。
違いは、AとBの順番が逆なだけなのだが・・・。

ものごとの順番としては、Aの次にBを行っている。
だから、P(B | A)は、Aの次にBしたときの確率だったのだ。
それが逆となると、「Aの次にBやって結果が出たんだけど、じゃあそこからそれっぽいパラメータを出してみようか」という、後出しじゃんけんみたいなもの、と読んだ。

教科書では、尤度が出てくるのはかなり後の方だ。
にもかかわらず、数式としてはさっさと出てくるので、この値を「尤度」として見ようと見まいとどうでもよかったのだろう。
深く考えるのは、もうちょっと気になってからやることにしよう。


「深層学習」の中では、p(d=1 | x)のように書いてあり、これは「事後確率」とのこと。
文章を見る限りでは、条件付き確率と同じ扱いのようだ。
xというパラメータを与えたときにd=1となる確率ということかな。

ただ、式が、

p(d=1 | x) = p(x, d=1) / ( p(x, d=0) + p(x, d=1) )

と、右辺がコンマで区切った確率になっている。
ベイズの定理と見比べると、コンマで区切った方が「事前確率」になるんじゃなかろうか。

でも、事後確率というか条件付き確率の式では、分母がP(A ∩ C)なんだが・・・。
はっ、このP(A ∩ C)が「Cした後のAの確率」という事前確率なのか?

なんか深みにはまりそうなので、間違っていたら間違っていたで、読み進めていけばわかるかもしれないので、この程度にして先に行こう。

2015年10月4日

[ai]『深層学習』を読む (2)

読み進まない・・・。
「2.4.3 二値分類」と「2.4.4 多クラス分類」で足踏みしている。

数式を理解するというのは最初からあきらめているので、そこは問題ない(ないのか?)。
まずは、この数式はこういうことをしたい、とか、この数式によって得られるものはこれだ、とか、そういう意味の部分だけで読み進めようとしている。

「二値分類」は入力されたものをAかBかに分類する。
Aか、そうでなければBだ。

「多クラス分類」は入力されたものを複数のどれかに分類する。
「これが一番近いな」という確率が一番高いものに振り分ける。

そこら辺の感覚はなんとなくわかるのだが、用語が出てきて悩む。
本では、二値分類の説明で「この問題を定式化する方法はいくつかある」といい、例として「事後確率をモデル化する」ということになった。
まあ、例を何かあげないとわかりづらいだろうということで、そうされたのだろう。

この「事後」で、止まってしまった。
「事後」があるなら、「事前」もあるはず。
ネットで検索すると、あった。
いくつか読んで、私の解釈としては、

  • 事前確率:今までの結果から、今度はこういう確率になるんじゃなかろうか、という確率。
  • 事後確率:そして実際にやってみた結果から計算した確率。

なのだが、なんか釈然としない。
結局、事後確率は事前確率と同じじゃないかという気持ちだ。
次の事象が発生しなければ事後確率だけど、発生したらそれは事前確率になるんじゃないだろうか。
そんなことを考えると、私の解釈が間違っているような感触が強い。
うーむ。

でも、事前の確率がどうであれ、事後の確率(というか、結果)が正しくないと意味がない。
だから「事後確率」の話をしているのかもしれない。
なので、もしかすると「事後確率」というのは、単に結果のこと、しかも1回だけじゃなくて何度もやった結果、と考えてもよいのかも。
どうかな?


手元に残っていた、学生時代の確率の教科書を眺めている。
「事前」「事後」らへんの言葉で目次に出てくるのは、「事後密度」で、節としては「ベイズ推定量」、章でいえば「統計的決定問題」になっている。

教科書で例になっているのは、油田の掘削を続けるかどうかを決める課題だ。
掘削するための調査をするかどうか、というところでどうするか考えている段階だ。
調査するには、お金がかかる。

でも、調査しないとわからない。が、調査した結果が100%正しいとも言えない。
そして調査結果の確率もパターンがあり、結果は「油田がある」「油田がない」「どちらともいえない」なんだけど、実際に油田があったときの調査結果確率と、油田がなかったときの調査確率が別になっている。

それだけでなく、油田を売るかどうか、というのも考慮がいる。
売るとお金が入ってくるのだ。
だから、油田がなかった場合は、調査もせずに売るのが一番収入が大きい。
逆も然りで、油田がある場合は、調査もせずに掘削するのが一番収入が大きい。
うーん、うーん・・・

統計数学 - 近代科学社
これが教科書だったのだ(私は九州大学関係ではないけど)。

「ベイズ」で見てみると、上の問題については「ベイズ決定法」が出てきた。
「経営陣の経験と勘で重みを与える」って・・・。
その「経験と勘」が、大量な学習データということになるのかな?
まだ「深層学習」を読んでいるところでは、そういう話は出てきてない。

とりあえず、2値にしろ多クラスにせよ、「事後確率の尤度を最大にする」のが目標。
数学用語?だと難しいが、ともかく「一番それっぽい値になるようにがんばる」ということだろう。


よく考えると、これは見積の「KKD(経験・勘・度胸)」と似てるよなあ(通称:えいやっ)。
「深層学習を応用することで見積ができる!」みたいなのは、面白そうだ(パラメータが難しそうだが)。

でも、学習できるほどの情報が集まらないか。
けれども、見積が人工知能でできるっていうのは、プロジェクト管理者としてはありがたいよな。

あるいは「このお客さんはどのくらいの仕様変更を出してきそうか」みたいなののほうが面白いか。
きっと、そのお客さんには見せられないようなパラメータがたくさんあるんだろうな。
お客さんの会社だけじゃなくて、その担当者自身の情報もパラメータにしないといかんだろうし。

こういう「自分ではどうしようもないし、自分の責任になってしまう」ようなものは、理論で解決することはできなさそうだけど、人工知能みたいなもので第3者的な意見を出せるようになると、その人の精神的負担は減るだろうな。
まあ、そうなったらそうなったで、「なんでコンピュータが出せたような結果がお前は出せないんだ!」とかなりそうだけど。

[c]静的解析ツールAdLintを試す

仕事では、有料の静的解析ツールでソースを解析している。
が、家でやるとなるとそうもいかない。
買えばいいんだろうけど、ちょっと個人で手を出すのも難しいし、その辺についてはプロジェクト単位で提供してほしいところではある。

あるのだけど、コンパイラでは気付かないバグが残ってしまうのも嫌なので、コンパイラとは別の観点でソースを見てほしいという気持ちは多分にある。
SourceMonitorを調べたのも、多角的にソースを見たいという気持ちからだ。

今回は、AdLintを試すことにする。
オープンソースの静的解析ツール AdLint(アドリント) | オージス総研
公開された当時に試した記憶はあるのだが、当時はC++が主だったので、あまり見てなかった気がする。
nRF51/52はCだし、最近はCばかりなので、見直さねば。


インストール方法は、こちら。
AdLint :: Advanced Lint - インストール方法

たぶん、公開された当時からあまり変わってない。
cygwinで試していたけど、今はもうrubyのバージョンが新しくなってるのでね。
つまり、インストールが楽になったということだ!

image

カレントディレクトリが妙なところになっているが、そこは関係ない。
私はcygtermを使っているので、ちょうど開きたいところがそこだっただけだ。

ともかく、インストールはすぐに終わった。
次はチュートリアルのようだ。
AdLint :: Advanced Lint - AdLint チュートリアル
まずはインストールの確認で、adlintコマンドだけを動かす・・・
・・・あれ、not foundだ。
どこかにいるだろうと探すと、マイドキュメントの下に.gemというフォルダがあり、その下の方にadlintがいた。
で、どうしたらいいのだ?

なんとなく、cygwinのrubyではうまく動かないのでは?という気がしたので、Windowsのrubyをインストールすることにした。


うちはWindows7 64bit。
Windowsのインストーラを使った。
インストールされたRubyコマンドプロンプトと、普通のコマンドプロンプトで確認。

C:\Users\xxx>gem -v
2.4.8

うむうむ。
では、cygwinで確認。

[~]$ gem -v
<internal:gem_prelude>:1:in `require': cannot load such file -- rubygems.rb (LoadError)
        from <internal:gem_prelude>:1:in `<compiled>'

えー。
ネットで検索したが、なんかめんどくさそうなので、AdLintはWindowsで動かすことにしよう。


ふたたびチュートリアルに戻る。

>adlint --version
AdLint all in one analyzer 3.2.14 (2014-05-10)
Written by Yutaka Yanoh and OGIS-RI Co.,Ltd.

よし。
では、サンプルソースをそのまま試すことにする。

>adlintize -o adlint
>cd adlint
>make verbose-all
C:\Winappli\Ruby22\bin\ruby.exe: No such file or directory -- /cygdrive/c/Winapp
li/Ruby22/bin/adlint (LoadError)
GNUmakefile:85: recipe for target 'adlint_verbose-all' failed
make: *** [adlint_verbose-all] Error 1

えー。
c:\Winappliというのは、私がRubyをインストールしたパスだ。
cygwinは関係ないのに・・・と思ったら、PATHにcygwin\binを通していた。
まあ、そうなるねぇ。
面倒だったので、Gnuのmakeをインストールして、再実施。
利用者ガイドを読むと、そう書いてあるので、インストールの説明よりは利用者ガイドを読んだ方がよいかも。


出力されるファイルで見るのは、メッセージが主だろう。
どうせなら統合開発環境で、警告確認と修正を見ながら行いたい。
そこは、出力フォーマットが標準的だから連携できるようだ。

あとは普通のソースで試してみないとわからんな。
警告の抑止や、パスの設定などがいるはずだから。

2015年10月3日

[ai]『深層学習』を読む (1)

まあ、書いてしまった以上、やらんとね。
というわけで、人工知能について調べることにした。

ぼくの実装した最弱のディープラーニング - きしだのはてな
こちらで紹介してある本を読んで実装されているらしいので、私もそれを買ってみた。
タイトルは『深層学習』。
なんかすごいタイトルだな、と思ったのだが、これを英語にすると「ディープラーニング」という、よく聞くようになった言葉になることを知ったのだった。

日本語タイトルのよいところは、「deep learning」だと「深く学習する」と読んでしまうところを、「層を深くして学習する」と読めるところだろうか。


本のページ数は、160ページに満たない。
コンピュータの技術書だったら薄い方になるけれども、これはコンピュータの本ではない。
たぶん、分類するなら、統計学の本というのが一番近いんじゃなかろうか。
まあ、機械学習の本とかを外すと、ということになるが。

 

今日は、2章の途中まで読み進んでいる。
あと4ページで2章を読み終えるのだが・・・把握が難しくて進まない。

私は人工知能の研究者ではないので、数式の理解はできない(そう、この本は数式が多いのだ)。
ただ、学校で習うようなニューラルネットワークのことが書かれているので、あまり読み流すこともできない。
それに、これを読んで実装してみたいという気がするので、式の意味はわからなくても、実装できるかどうかという観点では把握しておきたい。

「学校で習うような」と書いたが、これは時代によるものかもしれない。
1章は研究の歴史が書かれているのだが、ニューラルネットの研究はブームがあったらしく、私が学生だった頃はちょうどブームだったんじゃないかと思うのだ。
製品でも「ファジー」とかついてたし。

そういえばもっと前は「人工無能」っていう、オウム返しに話をしながら学習してるんだかどうだかっていうものもあった。
最初は「○○ってなんですか?」しか言わない人工無能が、突然切り返して話したりするのを楽しんだものだ。
しみじみ。

 

まずは、用語がわからないところを調べてみた。
書いてないのは、たぶんスルーした言葉だろう。
https://drive.google.com/file/d/0B2_3hJpJ5Ui2SUN0Z0pSMjNaQms/view?usp=sharing

参考にしたサイト

2015年10月1日

座っているかどうか知りたい

うちの部屋に、お仕事用の机と椅子を買おうとしている。

椅子はいいのを選びたいとか、スタンディングもいいよ、とか、そういうのを見ていたら、こういう記事が出ていた。

職場の座り過ぎに注意、2~4時間立つのが健康上理想 - WSJ

タイトルだけだと座りすぎについてなのだが、立ちっぱなしもよろしくない、とある。
まあ、だいたいは座っている時間が長い人が多いから、そういうタイトルにしたんだろうが。

ともかく、私もそういうのを気にしないといけない年頃なので、そもそもどうなんだろう?が知りたくなった。
つまり「私は1日にどのくらいの時間座っているのだろう?」だ。


座っている時間を調べるには、

  • 開始トリガ:座ったのを検知
  • 終了トリガ:座った状態が解除されたのを検知
  • 上記の間隔の総和

がわかればよいはずだ。
なので、座っているかどうかを検出できれば、あとは時間を足すだけでよい。

では「座っている」というのを、どうやって調べたらよいのだろうか?

私が思いついたのは、頭とつま先の高さがある閾値以上近づいたときが「座った」とみなす、だった。
なにか高さがわかるセンサーが2つあって、それを頭と足に付ける。
その高さの差が身長と同じなら、立っているだろう。
ちょっと短くなっても、それはうなずいたり、階段を上り下りしているだけかもしれない。
だから、ある程度以上の短さになった期間が続いたら座ったと見なし、そうじゃなくなったら座らなくなったと見なす、ということでいいんじゃなかろうか。

そう思って、高さを調べるセンサーがあるか調べたのだが、「絶対圧センサー」というものが出てきた。

高さ換算で3 cm単位の気圧変化を検出 高精度・高分解能の絶対圧センサ「XP-6000CA」を開発(2010年8月24日) | ニュースリリース | トピックス | エプソン

3cm!!
これはよさそうだ、と売っているところを探したのだが、出てこない・・・。
記事は5年前なのだが、まだ量産が難しいのか。

次を探すと、これが出てきた。

高低差50cm(分解能5mm)を検知できる! ウェアラブル機器・ヘルスケア機器に最適な世界トップレベルの高精度・低消費電力の絶対圧センサを発売 | オムロン

50cmを識別するなら、分解能も50cmじゃないのか?と思ったが、わざわざ書いているところを見ると違うのだろう。
こちらは、1500円くらいで買えそうな気配だ。

 

が、もう少し考えてみることにした。
センサーを2つ付けて、というのは、ちょっとストレートすぎる。
もうちょっとうまいことやって、センサー1つで済ませたり、違う方法で安価なセンサーで済んだりできるんじゃなかろうか。

できなかったとしても、悔やむようなものでもないから、まあいいじゃろう。