2017年8月8日火曜日

Windows版Tensorflowを使う

以前、RaspberryPi3でTensorflow、Kerasをインストールして機械学習を楽しんでいました。
が、学習には相当量なCPUパワーが必要で、Rpi3で開発は現実的ではない事が判明しました。最初から分かっていた事なのですが、Rpi3より圧倒的に高性能なWindowsPCで行う事にしました。

〇Bash on Windowsにインストール始める前にパスワードを忘れてしまったら、、、
> lxrun.exe /setdefaultuser root
> bash
$ passwd ユーザー名
パスワードを入力してから
$ exit
> lxrun.exe /setdefaultuser ユーザー名
> bash
でOKです。

ここからスタート
$ git clone https://github.com/yyuu/pyenv ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ exit
> bash

一回入りなおしてから、

$ pyenv install --list
anaconda3の最新バージョンを探してインストール
$ pyenv install anaconda3-4.4.0
$ pyenv global anaconda3-4.4.0
$ pyenv refresh
ここからは思いのままに欲しいパッケージを入れる。
$ conda install -c conda-forge tensorflow
$ conda install -c conda-forge keras
$ conda install -c conda-forge jupyter
$ conda install -c conda-forge scikit-learn
$ conda install -c conda-forge pandas
$ conda install -c conda-forge numpy
$ conda install -c conda-forge scipy
$ conda install -c conda-forge ipython


〇Windowsのローカルにインストール
https://repo.continuum.io/archive/.winzip/Anaconda2-4.4.0-Windows-x86_64.zip
をダウンロードしてインストール。
スタートメニューからAnaconda Promptを起動する。
$ pip install tensorflow
$ pip install keras

雑記:
 pipやconda、pyenvと統一感があまりないですが、目的は達成しているのでよしとします。

参考URL:
http://qiita.com/toyolab/items/bccd03d4cb7795112ab6
http://qiita.com/samacoba/items/207f2650ee60fe1de25a
http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c

2017年8月6日日曜日

Kerasサンプルを実行して動きを眺めてみる。


1.とりあえずサンプルをダウンロードする。

$ wget https://github.com/fchollet/keras/archive/master.zip
$ mv master.zip keras.zip
$ unzip keras.zip
$ cd keras/example

2.サンプルの内容を確認する。

Google翻訳をそのままコピペ。

数えてみると31個もサンプルがあるので、意味はわからないけどまずは機械学習を触ってみてサンプルをいじって遊ぶ程度なら沢山あればなんでもOKですね。
中身なんも分かってないですけど片っ端から動かしてみます。



 Implementation of sequence to sequence learning for performing addition of two numbers (as strings).
 2つの数値の加算を行うためのシーケンス学習へのシーケンスの実装(文字列として)。
 →実行すると、Q,T,赤い□の右隣に数字が出てくる。
  Qが足し算、Tが計算結果、赤い□はなんだろうか。
  正解率は52%あたりで中止した。

 Demonstrates how to write custom layers for Keras.
 Kerasのカスタムレイヤーを作成する方法を示します。
 →6万サンプル、1万テスト、エポック40、正解率は96%
  カスタムレイヤーの作成例らしいのであとで中身を見ようと思います。  

 Trains a memory network on the bAbI dataset for reading comprehension.
 読解のために、bAbIデータセット上のメモリネットワークを訓練する。
 →サンプルデータをダウンロードしてきて何やら解析を始める。
  エポック120あるけどかなり高速で1万サンプルをやっつけていく。
  ラズパイ3だとエポック1つ処理するのに30秒、つまり1時間かかるので中止。

 Trains a two-branch recurrent network on the bAbI dataset for reading comprehension.
 読解のために、bAbIデータセット上の2つの分岐の反復的なネットワークを育成する。
 →サンプルデータをダウンロードしてきて解析を始める。
  エピック40あってラズパイ3ではつらいので中止。
  認識率は20%くらいと低いようだ。

 Trains a simple deep CNN on the CIFAR10 small images dataset.
 CIFAR10の小さな画像データセットでシンプルな深いCNNを学習します。
 →サンプルデータをダウンロードして解析を始める。
  Using real-time argumantation.というのが表示される。
  中止もすんなり受け付けてくらないので他と何か違うらしい。

 Visualization of the filters of VGG16, via gradient ascent in input space.
 VGG16のフィルタのビジュアライゼーション。
 →レイヤーの数がかなりある。進行状況の表示も他のと異なっていてCurrent Loss valueが逐一表示されて、Processingを200回繰り返しやるみたいです。1つくらい最後までやってみようと

 Demonstrates the use of a convolutional LSTM network.
 畳み込みLSTMネットワークの使用を示します。

 Deep Dreams in Keras.
 ケラスの深い夢。

 Trains a convolutional stack followed by a recurrent stack and a CTC logloss function to perform optical character recognition (OCR).
 畳み込みスタックとそれに続く反復スタックとCTCログ損失機能をトレーニングし、光学式文字認識(OCR)を実行します。

 Trains a Bidirectional LSTM on the IMDB sentiment classification task.
 IMDBセンチメント分類タスクで双方向LSTMを訓練する。

 Demonstrates the use of Convolution1D for text classification.
 テキスト分類のためのConvolution1Dの使用を示す。

 Trains a convolutional stack followed by a recurrent stack network on the IMDB sentiment classification task.
 IMDBセンチメント分類タスクで反復スタックネットワークが後に続く畳み込みスタックを訓練する。

 Trains a FastText model on the IMDB sentiment classification task.
 IMDBセンチメント分類タスクでFastTextモデルをトレーニングします。

 Trains a LSTM on the IMDB sentiment classification task.
 IMDBセンチメント分類タスクでLSTMを訓練する。

 Compares different LSTM implementations on the IMDB sentiment classification task.
 異なるLSTM実装をIMDBセンチメント分類タスクで比較します。

 Generates text from Nietzsche's writings.
 ニーチェの著作からテキストを生成する。

 Implementation of AC-GAN ( Auxiliary Classifier GAN ) on the MNIST dataset
 MNISTデータセットにおけるAC-GAN(Auxiliary Classifier GAN)の実装

 Trains a simple convnet on the MNIST dataset.
 MNISTデータセットで単純なconvnetを学習します。

 Trains a Hierarchical RNN (HRNN) to classify MNIST digits.
 階層型RNN(HRNN)をトレーニングして、MNISTディジットを分類します。

 Reproduction of the IRNN experiment with pixel-by-pixel sequential MNIST in "A Simple Way to Initialize Recurrent Networks of Rectified Linear Units" by Le et al.
 Leらによる "整流された線形単位の再帰的ネットワークを初期化する簡単な方法"における画素単位の連続的なMNISTによるIRNN実験の再現

 Trains a simple deep multi-layer perceptron on the MNIST dataset.
 MNISTデータセットで単純な深層マルチレイヤパーセプトロンを学習します。

 Reproduction of the Net2Net experiment with MNIST in "Net2Net: Accelerating Learning via Knowledge Transfer".
「Net2Net:知識移転による加速学習」におけるMNISTによるNet2Net実験の再現

 Trains a Siamese multi-layer perceptron on pairs of digits from the MNIST dataset.
 MNISTデータセットの数字の対にシャーマンの多層パーセプトロンを訓練する。

 Demonstrates how to use the sklearn wrapper.
 sklearnラッパーの使用方法を示します。

 Trains a Stacked What-Where AutoEncoder built on residual blocks on the MNIST dataset.
 スタックされたWhat-WhereをトレインするAutoEncoderは、MNISTデータセットの残りのブロックに基づいて構築されました。

 Transfer learning toy example.
 転送学習のおもちゃの例。

 Neural doodle.
 神経の落書き。

 Neural style transfer.
 ニューラルスタイルの転送。

 Loads pre-trained word embeddings (GloVe embeddings) into a frozen Keras Embedding layer, and uses it to train a text classification model on the 20 Newsgroup dataset.
 訓練された単語埋め込み(GloVe埋め込み)をフリーズしたKeras埋め込みレイヤーに読み込み、これを使用して20 Newsgroupデータセットのテキスト分類モデルをトレーニングします。

 Trains and evaluate a simple MLP on the Reuters newswire topic classification task.
 ロイターのニュースワイヤトピック分類タスクで簡単なMLPをトレーニングし、評価します。

 Demonstrates how to use stateful RNNs to model long sequences efficiently.
 ステートフルなRNNを使用して長いシーケンスを効率的にモデル化する方法を示します。

 Demonstrates how to build a variational autoencoder.
 バリアントオートエンコーダの構築方法を示します。

 Demonstrates how to build a variational autoencoder with Keras using deconvolution layers.

 デコンボリューションレイヤを使用してKerasを使用してバリアントオートエンコーダを構築する方法を示します。


総論:
 全部のサンプルを動かして率直な印象。
 大量のデータセットがあって、
 学習用途に合わせたレイヤー構成があって、
 学習させるのに大量の処理時間が必要で、
 正解率は学習毎に変わって正解率100%はありえない。

という結論です。
あとディープラーニング自体は画像解析に特化している


詳しく理解してないですが、何を解析するかでどういう解析手法にするか選択するようです。
上記サンプルからわかることは、

 LSTM、GRU :自然言語解析
 CNN    :画像解析
 RNN    :自然言語、画像解析でも利用。亜種が色々。

のようです。

何が効果的か本来は試行錯誤しながら見つけなければいけないと思うのですが、インターネット上で研究成果も色々乗っているわけで、利用者側からすれば詳しいモデル構造を知らなくてもモデルのテンプレを集めておけば、データセット収集で目的の半分は達成できそうな気もする。


参考URL
https://keras.io/ja/



2017年8月5日土曜日

特化型人工知能について

AIには汎用型と特化型で2種類あるうち特化型についてまとめてみた。

特化型最高峰は最近の流行りである深層学習であるディープラーニングである。

ディープラーニングをざっくり説明すると、データから自ら特徴を見つけ出し、カテゴリ分けを行い、それに人間がラベリングを行い、実社会と人工知能の結果を結びつけるというものである。
今までと違うのが自ら特徴を見つけ出すという部分で、人が分かってない特徴も見つけ出す事も可能ということです。

学習手順を大まかに書くと、

 大量のデータセット→AIエンジニアが作った機械学習プログラム→結果

1.あるデータセット(動画・音声・テキスト・センサ情報など)を入力する。
2.AIが学習を行う。
  AIエンジニアがデータに最適な手法を組み合わせたり、評価関数を作り、求めるパラメータを明確化する。
3.それなりに結果得られるようになったら完成。


人工知能と人と同じく最初は判別しやすいデータを与えて勉強させることが必要です。
ベースを作ってから徐々に判定が難しいデータを与えて調節していく感じがいいように思えます。


AIエンジニアのお仕事
 ディープラーニングが登場してから毎週のように進化していっているので、対象のデータをどういったアルゴリズムを使えば最善であるか設計する作業があります。それと人工知能が出した結果が評価する評価関数の導出も必要だったりするので人工知能だからって手放しで全自動というわけではないのが現状である。


人工知能のやるにあたっていきなりディープラーニングをやるよりも、用語や機械学習の扱い方を覚えるためにまずSVMやニューラルネットワークから導入したほうがいいかも。


以下、完全にまとめきれてないのですが、用語集。


特化型AIの種類
ファジィ集合
・SVM(サポートベクトルマシン)
(NN)ニューラルネットワーク
NNを更に特化したものたち
 CNN、ResNet
 RNN
 LSTM

オートエンコーダ
・VAE(Variational Autoencoder)

アプリ
・OpenPose 動画で人の関節の動きを可視化する
・Merlin 深層学習ベースの音声合成ツールキットMerlin
・Eliza チャットボット


ライブラリ
・Tensorflow
・Chainer



・その他参考用語集
generative model...生成モデル
maximum likelihood learning...最尤学習
weights...重み
bias...バイアス(偏差)
meta-parameter...超パラメータ
stochastic...確率的
Robust...頑健
binary...2値
deterministic...決定論的
training data...訓練データ
validation data...検証データ
test data...テストデータ
GD(Gradient Descent)...勾配法
SGD(Stochastic Gradient Descent)...確率的勾配法
overfitting...過学習
approximate...近似
standard deviation...標準偏差
momentum...はずみ、運動量、今回の場合はGD中に振動の抑制項として使われる
ravine...峡谷、谷
brute-force...力ずく
weight decay...荷重減衰
mixing rate...混合率(理想分布への収束スピード)
coefficient...係数
partition function...分配関数
sparsity target...スパース化目標
sparsity cost...スパース化コスト
stability...安定性
discriminative...識別の
order of magnitude...10の累乗
eigenvalue...固有値
eigenvector...固有ベクトル
natural image...自然イメージ、多様性のあるイメージ
rectified...修正された
exponential family...指数型分布族
integrate out...積分消去


参考URL
http://machinelearningmastery.com/get-help-with-keras/
http://www.iryounomirai.com/news/study/1078/


2017年8月1日火曜日

[RaspberryPi]Tensorflowをインストールする

WindowsでTensorflowの環境構築がうまくいかなかったので、持て余しているラズパイにディープラーニング用フレームワークTensorflowをインストールすることにした。

ビルド済みのをインストールする方法もあるのですが、バージョンが古いのでソースからビルドします。

ちなみに2017年8月時点でJessie版RasbianのG++-4.9でビルドはできません。
参考URLにのっているのですが、threadpool.ccをビルドする時にエラーになります。

捕捉:試しにStretch版へアップグレードしてGCC-6、G++-6でビルドしてみたらこっちはOKでした。(スワップメモリを大きめに取っておく必要はありますが。)


以下を打ちこめばOK。
---
$ git clone https://github.com/tensorflow/tensorflow
$ sudo apt-get install -y autoconf automake libtool gcc-4.8 g++-4.8 libjpeg-dev
$ tensorflow/contrib/makefile/download_dependencies.sh
$ cd tensorflow/contrib/makefile/downloads/protobuf/
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
$ sudo ldconfig  # refresh shared library cache
$ cd ../../../../..

raspberry pi zero or 1ならこっち
$ make -f tensorflow/contrib/makefile/Makefile HOST_OS=PI TARGET=PI OPTFLAGS="-Os" CXX=g++-4.8

raspberry pi 2 or 3ならこっち(neon有効化?)
$ make -f tensorflow/contrib/makefile/Makefile HOST_OS=PI TARGET=PI \
OPTFLAGS="-Os -mfpu=neon-vfpv4 -funsafe-math-optimizations -ftree-vectorize" CXX=g++-4.8
---

追記:Bazelを使う場合、
ビルドにbazelを使用すると「configure」が使えるので、調整が色々できるようになります。
Bazelはv0.4.5を使います。

$ wget https://github.com/bazelbuild/bazel/releases/download/0.4.5/bazel-0.4.5-dist.zip
$ unzip -d bazel bazel-0.4.5-dist.zip
$ cd bazel

ソースコードで編集2か所あります。

nano scripts/bootstrap/compile.sh
117行目 末尾に「-J-Xmx500M」を追加。


nano tools/cpp/cc_configure.bzl
133行目 関数の頭にreturn "arm" を追加。

$ sudo ./compile.sh
$ sudo cp output/bazel /usr/local/bin/bazel

これでBazelインストール完了。
次にTensorflowのビルド
$ cd ~/tensorflow
$ ./configure
$ bazel build -c opt --copt="-mfpu=neon-vfpv4" --copt="-funsafe-math-optimizations" --copt="-ftree-vectorize" --copt="-fomit-frame-pointer" --local_resources 1024,1.0,1.0 --verbose_failures tensorflow/tools/pip_package:build_pip_package

これでOK。

★ビルドエラーが出て先に進めない、手っ取り早くインストールしたい場合
ビルド済みのwhlがあるので活用する方法があります。

$ wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/blob/master/archive/tensorflow-0.8.0rc0-cp27-none-linux_armv7l.whl
$ sudo pip install tensorflow-0.8.0rc0-cp27-none-linux_armv7l.whl

これでOK。

-----------
〇動作チェック

動作確認で画像認識をやってみる場合、
---
curl https://storage.googleapis.com/download.tensorflow.org/models/inception_dec_2015_stripped.zip \
-o /tmp/inception_dec_2015_stripped.zip
unzip /tmp/inception_dec_2015_stripped.zip \
-d tensorflow/contrib/pi_examples/label_image/data/
make -f tensorflow/contrib/pi_examples/label_image/Makefile
tensorflow/contrib/pi_examples/label_image/gen/bin/label_image
---

動作確認でカメラを使った動画認識をやってみる場合、
---
make -f tensorflow/contrib/pi_examples/camera/Makefile
tensorflow/contrib/pi_examples/camera/gen/bin/camera
---

ビルド時間がとても長いので気長にまちましょう。

Androider