Nature派 -3ページ目

分数型漸化式の一般解(1/4)

この動画にコメントしたのだが、分数型漸化式の一般解を導出してみたので書いておく。
https://www.youtube.com/watch?v=KXcPBFSkZFA
 
分数型漸化式というのは、一般的に
aₙ₊₁=(saₙ+t)/(uaₙ+v)
の形式の漸化式を言います。
 
これを解くときに、まず、
aₙ₊₁=p+r/(q+aₙ)
の形式に変換する。
 
aₙ=yₙ/xₙと置くと、
aₙ₊₁={(pq+r)xₙ+pyₙ}/(qxₙ+yₙ)
これから、
 
yₙ₊₁=(pq+r)xₙ+pyₙ
xₙ₊₁=qxₙ+yₙ
なので、pq+r≠0の時
 
xₙ₊₂-(p+q)xₙ₊₁-rxₙ=0
yₙ₊₂-(p+q)yₙ₊₁-ryₙ=0
という2つの同じ形をした漸化式が出てくる。
 
これを特性方程式 t²-(p+q)t-r=0 として解いた解をα,βとおくと、重解でない時、
xₙ₊₁-αxₙ=βⁿ⁻¹(x₂-αx₁)
xₙ₊₁-βxₙ=αⁿ⁻¹(x₂-βx₁)
 
これを解いて
xₙ={αⁿ⁻¹(x₂-βx₁)-βⁿ⁻¹(x₂-αx₁)}/(α-β)
同様に、
yₙ={αⁿ⁻¹(y₂-βy₁)-βⁿ⁻¹(y₂-αy₁)}/(α-β)
よって、
aₙ={αⁿ⁻¹(y₂-βy₁)-βⁿ⁻¹(y₂-αy₁)}/{αⁿ⁻¹(x₂-βx₁)-βⁿ⁻¹(x₂-αx₁)}...①
これが一般解となります。
 
これでも良いのですが、xₙ,yₙをp,q,rで表現すると、
a₁=y₁/x₁でx₁=1と置けるので、その時y₁=a₁
x₂=q+a₁
y₂=pq+r+pa₁
なので、
 
①={αⁿ⁻¹(pq+r+pa₁-βa₁)-βⁿ⁻¹(pq+r+pa₁-αa₁)}/{αⁿ⁻¹(q+a₁-β)-βⁿ⁻¹(q+a₁-α)}...②
 
とも表現できます。
 
分数型漸化式の一般解完成~♪\(^O^)/
 
重解の時や細かな部分などは次の回で。

もう、何のブログかわからなくなってきた(;^_^A
 
それではまた~(^o^)/~

スーパームーンとスカイツリー

あ~しばらくぶりです(^^ゞ
正月早々スーパームーンだというので、色々考えて出かけてみました。
同業者は4人位いましたねぇ~
 
周辺には色々と夜景とか見れる場所はあるのですが、微妙に出る位置や周辺環境が違います。
以前も来たことがあるのですが、想定通りの写真が撮れました。
やっぱり一回は行っておかないとわからないですね。
 
ダイヤモンド富士も見える場所なので、機会があればその時にまた行くかもしれません。
地平線上から真っ赤なスーパームーンが昇りはじめ、センターがこの位置でした。
天気も穏やかでいい日でした。
 
微速度撮影もしてきたので、そのうちアップするかもしれません。
気長に待てる人だけ待っててね(;^_^A
 
次回はいつになることやら。
それではまた~(^o^)/~
 

caffeインストール編

前後したが、caffeのインストールにかなり手間取った。


何もこだわらずにインストールすれば大した手間ではないが、最新のものにこだわったので、一筋縄ではいかなかった。
ほんとは色々試してますが、結局は...

 

●環境
・Ubuntu 16.04
・caffe
・Anaconda3 v.4.3.0 (Python3.6 64bit)
・openCV 3.2
・cuda 8.0
・cuDNN 5.1
 (コンパイルしたもの)
・openCV 3.1
・HDF5 1.8.18
・openBLAS


●インストール方法
・Anaconda
https://www.continuum.io/downloads
からPython3.6 Linux 64bit版をダウンロード後、
$ bash Anaconda3-4.3.0-Linux-x86_64.sh
でインストール。
あとは、画面の指示にしたがってバシバシ。
最後にPATHに追加するか聞いてくるので、そこでyes。


・ライブラリ類
$ sudo apt-get install libatlas-base-dev
$ sudo apt-get install python-opencv
$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev
$ sudo apt-get install --no-install-recommends libboost-all-dev
$ sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler
$ sudo apt-get install libatlas-base-dev
$ sudo apt-get install -y build-essential cmake git pkg-config
$ sudo apt-get install python-pip
※libopencv-dev、libhdf5-serial-devは別途インストールしたためカット。

追加で、
$ sudo ln -s libboost_python-py35.so libboost_python3.so


・openBLAS
$ sudo apt-get install libopenblas-base
$ sudo apt-get install libopenblas-dev
でもインストールはできるが、make時にCPUに応じた最適化を行っているとのことでmake路線で。
$ git clone https://github.com/xianyi/OpenBLAS.git
$ cd OpenBLAS/
$ make
$ sudo make install
$ sudo ldconfig

/opt/OpenBLAS/ にlibなどできているのでこれにパスを張っておく。
export LD_LIBRARY_PATH="/opt/OpenBLAS/lib:$LD_LIBRARY_PATH"


・cuda
https://developer.nvidia.com/cuda-downloads
からダウンロード。
あとは画面の指示に従い、
$ run 'sudo sh cuda_8.0.61_375.26_linux.run'
375とあるが、ドライバは367...気にしない...か?
Follow the command-line prompts
とあるので、まぁ、それに従ってちょこちょこやると。


・cuDNN
デベロッパー登録が必要。
https://developer.nvidia.com/cudnn

$ tar -zxf cudnn-8.0-linux-x64-v5.1.tgz
$ cd cuda/lib64
$ sudo cp lib* /usr/local/cuda/lib64/
$ cd ../include/
$ sudo cp cudnn.h /usr/local/cuda/include/


・HDF5
バージョン違いにならないように、アンインストール。
$ sudo apt-get remove libhdf5-serial-dev

https://support.hdfgroup.org/HDF5/release/obtainsrc518.html#src
からソースコードをダウンロード
$ cd ~/ダウンロード/hdf5-1.8.18
./configure --prefix=/usr/local/hdf5 --enable-cxx
make
$ sudo make install


・openCV 3.1
$ sudo apt-get install libeigen3-dev
$ sudo apt-get install libgtk2.0-dev
$ sudo apt-get install libgtkglext1-dev
$ sudo apt-get install freeglut3-dev
$ sudo apt-get install opencl-headers
$ sudo apt-get install libtbb-dev
$ sudo apt-get install libjpeg-dev
$ sudo apt-get install libjasper-dev
$ sudo apt-get install libpng++-dev
$ sudo apt-get install libtiff-dev
$ sudo apt-get install libopenexr-dev
$ sudo apt-get install libwebp-dev
$ sudo apt-get install libpython3.5-dev
$ sudo apt-get install python-numpy python-scipy python-matplotlib
$ sudo apt-get install python3-numpy python3-scipy python3-matplotlib

$ sudo apt-get install libopenblas-dev
$ sudo apt-get install liblapacke-dev
$ sudo apt-get install nvidia-opencl-dev
$ sudo apt-get install libvtk6-qt-dev

$ sudo apt-get install libv4l-dev
$ cd /usr/include/linux
$ sudo ln -s ../libv4l1-videodev.h videodev.h

$ cd ~/anaconda3/include
$ ln -s libpng16 libpng

opencvと拡張モジュールのダウンロード
$ cd
$ git clone https://github.com/Itseez/opencv
$ git clone git://github.com/opencv/opencv_contrib
$ cd opencv_contrib
$ git checkout 3.1.0
$ cd ~/opencv
$ mkdir build

この後、cmake,makeするが、以下のエラーが出るので対処しておく。

opencvのNetBSD videoio.h関連のコンパイルエラーが消えないので、videoio.hを入手。
ダウンロードはここから
http://www.filewatcher.com/m/videoio.h.20968-0.html
/usr/include/sys/videoio.hに保存する。

videoio.hとvideodev2.hがredefinitionエラーになる。
比較すると、videodev2.hにv4l2_compressionがないだけで、あとは一致。
これのみ残したままでvideoio.hの構造体等をカット。
#include <linux/time.h>もredefinitionエラー。videoio.hからカット。
typedef uint64_t v4l2_std_idもconflicting declarationエラー。videoio.hからカット
videoio.hはvideodev2.hに含まれたが、ソースがそのままというパターンか?

パスの設定初期化
$ export LD_LIBRARY_PATH=""
$ export CPATH=""

ffmpeg/avformat.h がありませんと言われる。WITH_FFMPEG=OFF
v4lとv4l2は競合できないようなので、WITH_V4L=ON,WITH_LIBV4L=OFFに。

//usr/lib/x86_64-linux-gnu/libvtkIOImage-6.2.so.6.2: `TIFFNumberOfTiles@LIBTIFF_4.0' に対する定義されていない参照です
~/opencv_contrib/modules/hdf/include/opencv2/hdf/hdf5.hppを書き換える
//#include <hdf5.h>
#include <hdf5/serial/hdf5.h>
./caffe/include/caffe/util/にも同名のファイルがあるが、こっちはちゃんとなっている。

OpenCV 3.1.0 ではCUDAのGraphCut モジュールを取り込むのだが、このモジュールはCUDA 7.5 でdeprecated に移動され、CUDA 8.0 から正式に除外されたらしい。
よって、OpenCV 3.1.0+CUDA 8.0のビルドはそのままでは失敗するらしい。
よって、 opencv/modules/cudalegacy/src/graphcuts.cpp の45行目に以下の修正が必要
//#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION >= 8000)

/usr/include/eigen3/Eigen/src/plugins/ArrayCwiseUnaryOps.h:173:1: error: expected unqualified-id before ‘>’ token
 sign() const
 ^
でエラー
~/opencv_contrib/modules/tracking/include/opencv2/tracking/onlineMIL.hppの57行目を
//#define  sign(s)  ((s > 0 ) ? 1 : ((s<0) ? -1 : 0))
#define  sign2(s)  ((s > 0 ) ? 1 : ((s<0) ? -1 : 0))
と変更。
~/opencv_contrib/modules/tracking/src/onlineMIL.cppの310行目を
//    _s = sign( _mu1 - _mu0 );
    _s = sign2( _mu1 - _mu0 );
339行目
//    _s = sign( _mu1 - _mu0 );
    _s = sign2( _mu1 - _mu0 );
と変更。

$ cd ~/opencv/build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules -D WITH_TBB=ON -D WITH_V4L=ON -D WITH_LIBV4L=OFF -D WITH_FFMPEG=OFF -D WITH_IPP=ON -D WITH_OPENGL=ON ..
$ make -j8
$ sudo make install
$ sudo ldconfig


・.bashrcの設定
export PATH=~/anaconda3/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib/x86_64-linux-gnu:/usr/local/cuda-8.0/lib64:/opt/OpenBLAS/lib:~/anaconda3/lib:$LD_LIBRARY_PATH
export PYTHONPATH=~/caffe/python/:$PYTHONPATH
export CPATH=/usr/include:$CPATH
export CPLUS_INCLUDE_PATH=/usr/include:$CPLUS_INCLUDE_PATH
export CAFFE_ROOT=~/caffe


・caffe
$ cd
$ git clone https://github.com/BVLC/caffe.git
$ cd caffe
$ cp Makefile.config.example Makefile.config

 

Makefile.configは以下を修正
USE_CUDNN := 1
# CPU_ONLY := 1
OPENCV_VERSION := 3
BLAS := open
BLAS_INCLUDE := ~/OpenBLAS
BLAS_LIB := ~/OpenBLAS
ANACONDA_HOME := $(HOME)/anaconda3
PYTHON_LIBRARIES := boost_python3 python3.6m
PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
   $(ANACONDA_HOME)/include/python3.6m \
   $(ANACONDA_HOME)/lib/python3.6/site-packages/numpy/core/include
PYTHON_LIB := $(ANACONDA_HOME)/lib
WITH_PYTHON_LAYER := 1
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/hdf5/serial
#CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
#  -gencode arch=compute_20,code=sm_21 \
CUDA_ARCH := -gencode arch=compute_30,code=sm_30 \

※openBLASの設定をしたが、なんかAtlasと判断されている。(σ_-)グスン…

 

pycaffeに必要なものをインストール
$ cd ~/caffe/python
$ for req in $(cat requirements.txt); do pip install $req; done

公式ガイド通りにシンボリックリンクを張る
https://github.com/BVLC/caffe/wiki/Ubuntu-16.04-or-15.10-Installation-Guide
$ 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.10.1.0 libhdf5.so
$ sudo ln -s libhdf5_serial_hl.so.10.0.2 libhdf5_hl.so

 

lippicvがないと言われるので、
sudo ln -s /usr/local/share/OpenCV/3rdparty/lib/libippicv.a /usr/local/lib/

/usr/local/lib/libopencv_core.so: `std::__cxx11::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str() const@GLIBCXX_3.4.21' に対する定義されていない参照です
cd ~anaconda3/lib
ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 libstdc++.so
ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 libstdc++.so.6

export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib/x86_64-linux-gnu:/usr/local/cuda-8.0/lib64:/opt/OpenBLAS/lib:~/anaconda3/lib

 

cd ~/caffe
make all
make test
make runtest
make pycaffe


やっと動いた~o(^^o)(o^^)o


それではまた~(^o^)/~

MNIST試してみた編

MNIST...何と読むのか、ずっと疑問に思っていたが、「エムニスト」と読むらしい
Mixed Natioal Institute of Standards and Technology database
の略。

 

新旧のパソコンで処理時間にどれだけ違いがあるか、caffeインストールに標準で付いてきているMNISTで試してみた。
solverやtrain,testは同じものを使用。

 

$ ./build/tools/caffe train --solver examples/mnist/lenet_solver.prototxt
※一部省略
(新PC)
21:05:34.013125 ... Using GPUs 0
21:05:34.022621 ... GPU 0: GeForce GTX 1080
...
21:05:51.445132 ... Optimization Done.
(旧PC)
21:47:23.768877 ... Using GPUs 0
21:47:23.976817 ... GPU 0: GeForce GTX 750Ti
...
21:48:23.499045 ... Optimization Done.

 

60秒→17秒

CUDAコア 640→2560
メモリ 2GB→8GB
と4倍程度なので、まぁこんなもんか。

 

最近Geforce GTX 1080Tiが発表されたようですが、それならCUDAコア3584なので、もう少し速くなるのかな?
現時点で発売されているのは、リファレンスモデルのみで約10万円。
1080なら8万前後。
・1080Ti SLIで、
17秒 * 2560/(3584*2)=6秒 20万円
・1080Tiで、
17秒 * 2560/3584=12秒 10万円
・1080 SLIで、
17秒 * 2560/(2560*2)=8.5秒 8万円

 

...まぁ、現状維持ってことで。

 

それではまた~(^o^)/~

パソコンセットアップ編

パソコン組み立て、こんな感じで仕上がりました。

 

Intel CORE i7-7700K

 

GIGABYTE GEFORCE GTX 1080 G1 GAMING
こいつの仕事っぷりに注目。

 

 

 

新旧2台

DVDが白(;^_^A

 

組み立て後、LANケーブルを挿してみるがネットにつながらず。
どうもNIC(ネットワークインタフェースコントローラ)を認識していない。

$ ifconfig

やはり127.0.0.1しか表示されていない。
ドライバを入れればよいのだが、この場合が大変。
以前仕事でも経験がある。

A「なんか、ネットにつながらないんだけど、どうすればいいの~?」

B「そんなんドライバ入れればいいじゃん」

A「そっかぁ~。そのドライバってどこにあるの~?」

B「メーカーのHPにあるよ。そこからダウンロードすればいいよ」

A「そっかぁ~。でどうやってダウンロードすればいいの~」

B「ネットにつなげばすぐだよ」→①へ

エンドレスで続く...

まぁ、別のパソコンがあればいいのだが、LINUXってこの辺が初心者には難しいところなんだろうな。
Windowsだったらありえない話ですね。

 

$ lspci | grep ‘Ethernet\|Network’

I219-Vとの表示。
ダウンロードすると、PRO40GB, PRO100, PRO1000, PROXGBとあるが...どれ?...
何が違うのか...1000BASE-Tのことか?ならPRO1000かな?
ということで、
e1000e-3.3.5.3.tar.gz
をセットアップ。
解凍後、~/e1000e-3.3.5.3/srcに移動し、
$ sudo make install
$ sudo modprobe -r e1000e
$ sudo modprobe e1000e

これでたぶんドライバが入ったはず。


確認は、
$ lsmod | grep 'e1000e'
でe1000eが表示されたのでOK

 

$ ifconfig
NICが認識されましたぁ~o(^^o)(o^^)o
ネットにも繋がった~\(^O^)/


それではまた~(^o^)/~