まりま

移転しました→5hyn3.github.io

仮想マシン上にCaffeをインストール

 元々私のPCにはCaffeやTensorFlow等の機械学習ライブラリの学習用にWindows8.1とは別にUbuntuもインストールされており、デュアルブート出来たのですがUbuntuを起動していると勿論Winodwsのソフトは使えず、それが原因で機械学習の勉強から足が遠のいていました。そこで、今回はWindows上の仮想マシンに勉強用の環境を整えようと思います。内容的には同じ環境をデュアルブートされている方のUbuntu上に整える時のための備忘録になるため、真新しい話などはありません。ほぼ参考元と同一になります。

環境

ホストOS:Windows8.1

ゲストOS:Ubuntu 16.04 LTS(VMware Player)

仮想マシンのセットアップは既に済んでいるとします

Caffeの導入

0.構成の予定

今回は仮想マシン上なのでGPUは使えない、導入しておいたほうがCaffe以外にも役に立ってとても便利ということで、

・CPUモード

・Anaconda使用

という構成でビルドします。なお、Anaconda周りの環境構築はここに書くと長くなってしまうので参考元を参照してください。この記事ではpyenvを使用し、anaconda2-4.1.0を導入した場合で進めていきます。

1.お約束

各種ソフトウェアのインストール前に

sudo apt-get update

sudo apt-get upgrade

はしておきましょう

2.CUDAのインストール

sudo apt-get install nvidia-cuda-toolkit

3.BLASのインストール

sudo apt-get install libatlas-base-dev

4.その他の依存関係のインストール

sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev


sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler

5.Caffeのダウンロード

sudo apt-get install git
git clone https://github.com/BVLC/caffe.git

6.Makefile.configの設定

Makefile.config.exampleをコピーしてMakefile.configを作成

 

・CUDA_DIR := /usr/local/cuda → コメントアウト

・# CUDA_DIR := /usr → アンコメント

・# CPU_ONLY := 1 → アンコメント 

PYTHON_INCLUDE := /usr/include/python2.7 → コメントアウト

PYTHON_LIB := /usr/lib  →コメントアウト

・ANACONDA_HOME :=~~~

 → ANACONDA_HOME := $(PYENV_ROOT)/versions/anaconda2-4.0.0

PYTHON_INCLUDE := $(ANACONDA_HOME)~~~

 →PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
  $(ANACONDA_HOME)/include/python2.7 \
  $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include

・INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/includeの行に

 /usr/include/hdf5/serialのパスを追加

・LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/libの行に

 /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serialのパスを追加

・#WITH_PYTHON_LAYER := 1 → アンコメント

 

このようにMakefile.configを編集する

7.エラー解決のコマンド

このままインストールするとエラーが発生するので

find . -type f -exec sed -i -e 's^"hdf5.h"^"hdf5/serial/hdf5.h"^g' -e 's^"hdf5_hl.h"^"hdf5/serial/hdf5_hl.h"^g' '{}' \;
cd /usr/lib/x86_64-linux-gnu
sudo ln -s libhdf5_serial.so.8.0.2 libhdf5.so
sudo ln -s libhdf5_serial_hl.so.8.0.2 libhdf5_hl.so

を実行

 

caffe/pyrhonディレクトリで

for req in $(cat requirements.txt); do pip install $req; done

を実行

8.コンパイル

make -j8 all 

make -j8 test

make -j8 runtest

なお、この構成でやってみるとruntest時にerror127が発生し、testをpass出来ません。この問題はanaconda内のlibフォルダへのパスを通すことで解決しました。

pip install --upgrade pip

pip install -r ./python/requirements.txt

make -j8 pycaffe

make -j8 pytest

9.Python用の設定

PyCaffeのパスを追加します

echo "export PYTHONPATH=$PYTHONPATH:$HOME/caffe/python" >> ~/.bashrc
source ~/.bashrc

最後にimport caffeでエラーが出ないか確認します。でなければビルドは成功です。

python -c 'import caffe'

あとがき

 以前にcaffeを導入した時はCPUモードでのビルドではあまり悩まず、GPU周りでかなり困った覚えがありました。しかし、今回はその当時とは導入する方法が違っていてCPUモードでのビルドなのにかなり戸惑い、手間取りました。当時と同じノリでやったら全くうまく行かなかったので...とりあえずかなり時間はかかりましたがなんとか導入は成功したのでこれで良しとしておきましょう。次はTensorFlowかChainer辺りを導入しましょうか。調べてみるとChainerは自分が触ってみた当時よりもかなりコードが書きやすくなってるみたいなので楽しみです。

 

参考


github.com

C++で関数テーブルを作る

 条件に合わせて行う処理を切り替える時、ただ単に分岐するよりも関数テーブルを作ってそれを利用したほうが可読性が増します。しかし、ポインタを弄ったりして関数テーブルを作るのは意外と骨が折れます。ここではC++11の機能を使ってお手軽に実装できる関数テーブルを紹介します。

 これだけのコードで関数テーブルが実装できます。クラス内でメンバ関数を登録する場合は

functionTable["foo"]=std::bind(&Classname::Funcname,this,std::placeholders::_1;

とstd::bindの中身を書き換えてやると良いです。

Courseraの機械学習コース受講終了

f:id:ewvss:20160515230011p:plain

3月中頃から始めてようやく終わりました…長かった…でも、楽しかったですし、最後のビデオを見終わった時は感無量でしたね。これからどうしようかなぁ…とりあえずTensorFlowとCaffeやChainerあたりを触ってみましょうかね。元々去年辺りから機械学習の技術に触れてそれらライブラリを触ってみるも知識の無さに打ちのめされたので受講したわけですし、兎にも角にも自分にお疲れ様です。

 

なお、お金がそもそもそんなに無かった上、入金する手段も無かったので修了証はありません。そこだけちょっと後悔してますが、まぁ欲しかったらまた受ければいいので。

Activity不在のServiceから別のServiceを起動するとServiceが落ちる話

移転のお知らせ
ブログはこちらに移転しました。現在はこちらで更新をしています。

https://5hyn3.github.io/

 

Activity起動中、もしくはバックグラウンドでまだActivityが生きている時には正しく動作する、しかしActivityを殺してから操作するとエラーでサービスが落ちる、しかもその内容はデバッグログに上がってこない上至る所でLog出力をさせてもServiceが落ちてしまう場所が変わってしまう。

 こんな現象があり、デバッグのしようもなく途方に暮れていましたが、Logcatの出力から自作アプリのみのフィルタを外し、全出力を閲覧した時、ようやく原因が分かりました。サービスから起動した別のサービス上でandroid.os.DeadObjectExceptionが投げられていました。どうやら、Activityから起動したServiceが、Activityが死んでいる状態でさらに別のServiceを起動する場合には、起動対象のServiceを別プロセスに分離しなければならないようです。ということでandroidmanifest.xmlandroid:process属性を追記してやってデバッグ完了です。

参考

d.hatena.ne.jp

AndroidStudio2.0でパッケージ名の変更

 AndroidStudio2.0以降でパッケージ名を変更する場合もこれまでと大差無い方法で変更できますが、このバージョンではアプリを検索されやすくするというApp Indexingの為のコードを自動生成する機能が付いています。

App Indexing  |  Google Developers

本来なら自動生成したらそのままさわらないで良いはずです、実際そのほうがアプリをいろいろな人にみてもらえるそうですし。しかし、コードを自動生成後にパッケージ名を変更するとビルドは通りますがなぜか動いてくれません。自分の手で作ったソースの変えなければいけない所すべての部分においてパッケージ名を適切に変更しても自動生成されたコード内でエラーが発生してしまいます。こうなってしまえばもうお手上げで、自動生成された部分を消すしかありませんでした。パッケージ名はよく考えて付けましょう。

ライセンス問題

 私はライセンスについてちょっとうるさいです。というのも、フリーのオープンソースライブラリを使わさせていただいている立場なのだから、そのライブラリのライセンスを守ることは最低限のそのコミュニティに対する礼儀として必要な事だと考えているからです。しかし、周りを見ると部活で作った公開範囲の小さなプログラムには著作権表示なんてしなくていいだろ、と言った姿勢の方が結構多く…自分が無闇に目くじらを立てすぎな感じもしますが、ライセンスは守った方がいいに越したことはありません。技術のレベルがどうこうとかそういう問題以上に倫理レベルの話で問題を起こしてどうするんだろうと感じるのでこれからもライセンスについてはとやかく言っていこうと思います。