のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

Jupyter Notebookの次世代版、JupyterLabのこれが凄いポイントの紹介

みなさんこんにちは
お元気ですか。私は元気です。

Jupyter Notebookの次世代版、JupyterLabを紹介したいと思います。

※7/17 誤字脱字、一部画像を修正

JupyterLab

JupyterLabとは

JupyterLabはJupyter Notebookをベースに拡張したものである。
所謂IDEと呼ばれるツールと同様である。
現在はAlpha版がリリースされています。

※Scipy2016のカンファレンスビデオはこちらにあります。


JupyterLab: Building Blocks for Interactive Computing | SciPy 2016 | Brian Granger

JupyterLabのインストール

公式ホームページと同じでできます。

pip install jupyterlab
jupyter serverextension enable --py jupyterlab
jupyter lab

jupyter notebookが4.2.0未満の場合はupgradeが必要です。

この画面が立ち上がれば、Jupyter Labの立ち上がりを確認することができます。

f:id:tereka:20160717111705p:plain

今日はこれ凄いと思ったポイントを紹介したいと思います。

Jupyter Labの凄い点

1.画面分割が可能

以前までのJupyter Notebookでは、1画面での操作が基本で、
2画面の同時表示ができません。

しかし、JupyterLabからはそれが可能となっています。

ファイルをドラッグアンドドロップをすることで、画面を2画面に分割することが可能です。

f:id:tereka:20160716191447p:plain

また、更に追加でこんな感じの画面を展開することができます。

f:id:tereka:20160716212102p:plain

2.タブによる画面切り替え

なんと、タブがあります
タブの切り替えで、 様々なことができます。
タブがないと様々な画面をいちいち、開いて閉じてといった
動作をしなければならないので効率が悪かったのですが、
それがサポートされるというのは非常に大きいことです。

※1にも記載されているので画像は省略

3.ファイルの操作機能

ファイルが右クリック、ドラッグアンドドロップなど
様々な方法で操作することができます。

これまでドラッグアンドドロップなど使えず、結構手間だったことを考えると
かなり助かります。

f:id:tereka:20160716223100p:plain

4.コマンドの検索機能

Jupyter Labには様々なコマンドがついています。
vimモードの実行や一部ライブラリのヘルプページの閲覧をするなど
色々とできるのですが、複数の機能があり探すのも面倒くさい時に使える機能です。

Commandタブの一番上の空白に検索するテキストを入れることができます。
そのテキストをベースにCommand一覧から探してくれます。

f:id:tereka:20160716223501p:plain

5.csvを綺麗に表示する

csvを右クリックしOpen withでTableを選択し、開くと
テーブルを綺麗に見せることができます。

f:id:tereka:20160716232905p:plain

6.Widgetが1度のみの表示がされる。

これはさくっと自分で作るのが難しかったのでビデオから取ってきました。
Widgetを操作するとJupyter Notebookでは
Widgetが増えていくような挙動を示していました。

f:id:tereka:20160716233151p:plain

しかし、Jupyter Labからは何度操作しても一度の表示となります。

f:id:tereka:20160716233228p:plain

感想

まだまだAlpha版ですが、以前までのJupyter Notebookよりも
かなり進化しているような様子が見られます。

今後の動向にも期待ですね!

dlibで画像を認識させて、遊んでみた。

皆さんこんにちは
お元気ですか。私は元気です。

ついに、今回はdlibで遊んでみました。
※dlibとは何だ?と思う方は以下のページへ

nonbiri-tereka.hatenablog.com

基本的な構成

基本的の構成は以下のようになっており、よく使いそうな項目と
あるけどExamplesが存在しない項目の紹介となっています。

画像の読み込みと表示

画像を読み込んで窓に開いてみます。
C++の以下のコードで動作します。案外短かった。

しかし、コンパイルに結構手こずりました。
ライブラリを見ながら、リンクに何が不足しているのかを考えつつ、リンクしていきました。
(むしろCMakeを書くべきか・・・)

g++ -I/Users/Tereka/Programing/dlib/ -lpthread -ldlib -lblas augmentation.cpp

ソースコードは基本的にこれに追加する形式となります。

#include <dlib/gui_widgets.h>
#include <dlib/image_io.h>
#include <dlib/image_transforms.h>

using namespace std;
using namespace dlib;

int main(int argc, char const *argv[])
{
        array2d<rgb_pixel> img;
        //画像をファイルから読み込む。
        load_image(img, argv[1]);
        //窓を定義する。
        image_window window(img, "Original Image");
        //クローズするまで開く。
        window.wait_until_closed();
        return 0;
}

画像の処理をかけてみる。

画像処理を実施してみました。
コンパイルコマンドは前項のをお使いください。

今回使ったのは、flipとgaussian blurと呼ばれる画像の処理をかけてみました。

#include <dlib/gui_widgets.h>
#include <dlib/image_io.h>
#include <dlib/image_transforms.h>

using namespace std;
using namespace dlib;

int main(int argc, char const *argv[])
{
     array2d<rgb_pixel> img;
    //画像をファイルから読み込む。
    load_image(img, argv[1]);
    //窓を定義する。
    image_window window(img, "Original Image");
    //クローズするまで開く。
    window.wait_until_closed();

    array2d<rgb_pixel> fliped_image;

    flip_image_up_down(img,fliped_image);
    image_window window2(fliped_image, "Fliped Image");
    window2.wait_until_closed();

    array2d<rgb_pixel> gaussian_blur_img;

    gaussian_blur(img,gaussian_blur_img);
    image_window gaussian_window(gaussian_blur_img, "Gaussian Image");
    gaussian_window.wait_until_closed();
    return 0;
}

画像特徴に使われる処理を実施してみる。

Local Binary Pattern(LBP)とHog処理を実施してみます。

Selective Searchを実施してみました。
実はこれ、PythonにはExampleがありますが、なんと、C++にはExampleを用意してくれません。
ということで、ドキュメントを読みつつ、自分でコードを書いてみました。

#include <dlib/gui_widgets.h>
#include <dlib/image_io.h>
#include <dlib/image_transforms.h>
#include <vector>
#include <iostream>

using namespace std;
using namespace dlib;

int main(int argc, char const *argv[])
{
    array2d<rgb_pixel> img;
    //画像をファイルから読み込む。
    load_image(img, argv[1]);
    //窓を定義する。
    image_window window(img, "Original Image");
    //クローズするまで開く。
    window.wait_until_closed();
    std::vector<rectangle> rects;
    //Selective Search
    find_candidate_object_locations(img,rects);
    //四角形の描画
    for (int i = 0; i < rects.size(); i++)
    {
    	cout << rects[i].top() << endl;
    	rgb_pixel pixel(255,0,0);
    	draw_rectangle(img,rects[i],pixel);
    }
    //表示
    image_window selective_window(img, "Selective Search Image");
    selective_window.wait_until_closed();
    return 0;
}

find_candidate_object_locationsがSelective Searchの実行関数となります。
その結果は与えたrectsの中に格納されるので、その結果を描画しています。

f:id:tereka:20160714230810p:plain:w250f:id:tereka:20160714230823p:plain:w250

OpenCV連携

OpenCV連携についてです。dlibライブラリ自身でサポートしており、
OpenCVで使いたい場合はOpenCVのMat型、dlibの関数しかない場合はdlibの関数を使うなど
簡単にこの連携を実現できます。

g++ -O2 -I/Users/Tereka/Programing/dlib/ -lpthread -ldlib -lblas `pkg-config --cflags opencv` `pkg-config --libs opencv` opencv_test.cpp

基本的にはtoMatとcv_imageを使えばよいです。実装コードは以下となっています。

#include <opencv2/highgui/highgui.hpp>
#include <dlib/gui_widgets.h>
#include <dlib/image_io.h>
#include <dlib/image_transforms.h>
#include <dlib/opencv.h>

using namespace dlib;
using namespace cv;

int main(int argc, char const *argv[])
{
	Mat temp = imread(argv[1]);
        //OpenCV→dlib変換
	cv_image<bgr_pixel> cimg(temp);
        //dlib→OpenCV変換
	Mat convertedMat = toMat(cimg);
	return 0;
}

感想

dlib使いこなせると便利ですね。deep learningも実行でき、ある程度関数が整備されているので
C++であって非常に容易に複雑なアルゴリズムを実行することができます。

dlibと呼ばれる画像処理ライブラリを使ってみた

皆さんこんにちは
お元気ですか。私は元気です。

日本ではあまり見られないdlibと呼ばれるライブラリの画像処理ライブラリを
使ってみたいと思います。

dlibについて

dlibとは

公式サイト:dlib C++ Library

Dlib is a modern C++ toolkit containing machine learning algorithms and tools for creating complex software in C++ to solve real world problems. It is used in both industry and academia in a wide range of domains including robotics, embedded devices, mobile phones, and large high performance computing environments. Dlib's open source licensing allows you to use it in any application, free of charge.

Dlibは現実世界の問題を解決するための複雑なソフトウェアを作るためのC++機械学習アルゴリズムやツールであり、
産業や学術の広いドメインに適用でき、オープンソースで、無料である。

実はコンピュータビジョン勉強会に参加するまではこのライブラリの存在を知らず、
そういえばあったなぁと今から使ってみる次第です。

因みにPythonのパッケージもありますが、Macでは動かなかったので諦めてC++にします。
Ubuntuだと動くらしいです。

Install方法

boostなどのその他ライブラリは入っている前提です。

git clone https://github.com/davisking/dlib
cd dlib
cd examples
mkdir build
cd build
cmake ..
cmake --build . --config Release

因みにXQuartzがないと、動作しません。そのため、ない人は以下のページからXQuartzを入れましょう。
https://www.xquartz.org/

インストール後に、シンボリックリンクを貼りましょう。

ln -s /opt/X11/include/X11 /usr/local/include/X11

そして最初のコマンドを実行するとpipを使ったインストールができます。

因みにこのライブラリ何ができるのか?

公式ホームページから引っ張ってきました。

Algorithms
API Wrappers
Bayesian Nets
Compression
Containers
Graph Tools
Image Processing
Linear Algebra
Machine Learning
Metaprogramming
Miscellaneous
Networking
Optimization
Parsing

実際にニューラルネットワークSVRなどの機械学習、画像処理、ベイジアンネットワークなど
計算、機械学習系のサポートが強力です。
SVMのCross Validationの例、ResNetの実行例などもあり、サンプルを見ると使い方はかなり見えるのではないでしょうか。

dlibの画像処理ライブラリ紹介

では、何ができるかを見てみましょう。
ソースコードの解説とかは次回以降にします。

顔の輪郭検出

顔の輪郭検出用のコードは、face_landmark_detection_exを使います。

wget http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
bzip2 -d shape_predictor_68_face_landmarks.dat.bz2
/face_landmark_detection_ex ./shape_predictor_68_face_landmarks.dat ../faces/2008_004176.jpg

f:id:tereka:20160707235319p:plain

顔検出

./face_detection_ex ../faces/2008_002470.jpg

f:id:tereka:20160707235202p:plain

Hog特徴量の計算

./fhog_ex ../faces/2008_002079.jpg

f:id:tereka:20160707235416p:plain

画像の表示

./image_ex ../faces/2008_002506.jpg

f:id:tereka:20160707235123p:plain

感想

様々なライブラリがあってC++で書く場合は
色々と楽しいことができそうな気がします。

内部的にはC++11ベースっぽいです。詳しい使い方はまた次回

Bandit Problemと強化学習ーこれであなたも大金持ち?ー

皆さんこんにちは
お元気ですか。私は元気です。
本日はBandit Problemと呼ばれる問題を強化学習で解いてみます。

  • Bandit Problemについて
  • 解き方
    • 今回解いた問題
    • epsilon greedy algorithm
    • Softmax Tempature
    • UCB
  • 感想
  • 参考文献
  • ソースコード

Bandit Problemについて

Bandit Problem(和名:バンディット問題)は
当たる確率の異なるスロットマシンから最も大きい報酬を得るには
どうすればよいか?といった問題です。

以下のようなスロットがあったとします。
f:id:tereka:20160703183327p:plain

しかし、実はスロット達、あたる当たる確率が異なるスロットなのです。
そのようなスロットの中で最も報酬を高くするようスロットを選んでいくにはどうすればよいかといった問題を
解くことができます。
つまり、どうすれば大金持ちになれるかわかるということです、もちろん儲かる保証はしません。

因みに一般的な問題としては、A/Bテストに使われているとかいないとか。

解き方

いくつか解法がありますが、今回は3点紹介します。

  1. epsilon greedy algorithm
  2. Softmax
  3. UCB

今回解いた問題

今回は強引に以下の割合で当たる問題を解いてみました。
0.5, 0.3, 0.7, 0.2, 0.9, 0.2, 0.3, 0.2, 0.3, 0.2, 0.4

つまり、最も良いのは0.9でこれを引き続けることが理論上、最も良い作業となります。

epsilon greedy algorithm

epsilon greedy algorithmは一定の確率で、適当に選ぶ振る舞いをし、
基本的に最も期待が高い報酬を選択します。
ある意味直感的にわかりやすい

一定回数実施すると、最も高い報酬のところを選択するよう収束するように動作します。
因みにグラフも書いてみた。
以下のグラフは縦軸が報酬の平均、横軸がトライ回数です。

f:id:tereka:20160703181902p:plain

基本的に報酬は最大に収束するように動作しますが、最悪の行動を選択した場合において
残り続けてしまうため収束が遅くなる可能性があります。

Softmax Tempature

温度と呼ばれる概念を与えたBandit Problemの解き方。
epsilon greedy algorithmでは、ランダムな選択時に全ての行動の選択が等しくなる欠点があり、
その欠点を解消するように挙動する。

基本的にはSoftmax関数であるが、温度(T)と呼ばれる概念が投入されており、
この温度関数が高いと、ランダムに振る舞おうとする傾向が強くなるそうです。
(※{X_i} = i番目の期待値、{P_i} = i番目を選択する確率)
しかし、この温度と呼ばれる概念

{ \displaystyle
P_i = \frac{e^{X_i/T}}{\sum{e^{X_i/T}}}
}

グラフ
f:id:tereka:20160703181906p:plain

UCB

UCBと呼ばれる値を導入した
UCB関数は、選択の頻度が低い値を選ぶよう挙動し、
選択の頻度の低い値を選択し、推定する。式は以下の式であり、Cは定数
nは総プレイ回数で、{n_i}はindexのiを選択した回数

{ \displaystyle
UCB_i = X_i + C\sqrt{\frac{lnn}{n_i}}
}

実際にUCB関数を使ってBandit Problemを解いたグラフが以下

f:id:tereka:20160703181908p:plain

感想

実は何回かepsilon greedyを実行していますが、結構ブレブレな挙動を示す傾向ですね。
かなり乱数に左右されるアルゴリズムであることがわかる。。。
Bandit Problemで実際のスロットやるとどうなるのか気になるけど怖くてできない。

参考文献

(強化学習におけるUCB行動選択手法の効果)

ソースコード

では、最後にソースコードを書いてみました。
基本的には選択手法とパラメータ以外は同じです。

続きを読む

強化学習とは何か、調べてみた

皆さんこんにちは
お元気ですか。私は元気です。

今日は強化学習の勉強がてらメモを書いてみました。
個人的には最近、注目している分野で、ゴールがあるような(クラス分類やRegression)
機械学習と異なり、汎用的に色々問題が解けそうだからというのが理由です。
(なんか色々語弊を生みそう)

間違っていれば教えて下さい。

強化学習

強化学習はある環境ないにおけるエージェントが、
現在の状態を観測し、取るべき行動を決定する問題を扱う
機械学習の一種 by wikipedia

この中で登場するのは、「状態」と「行動を決定する」といったところでしょうか。
つまり、「ある状態の時に、どう行動をするか」といったことを解く問題となります。

強化学習における要因

強化学習について考えなければならないことが4点あります。

①ポリシー(policy)・・・どのように行動するか
②報酬関数(reward function)・・・強化学習問題のゴールを定義する関数
③値関数(value function)・・・長期間に渡る評価指標
④環境モデル(model of the environment)・・・アクション・状態の定義

Policy

ある状態が与えられた時、観測された状態からどう行動するか規則のこと。
一番、簡単な方法はLook up table(「この状態の時は、こうする。」が一覧表で決まっている)

Reward Function

強化学習を実施する時に使うゴール部分
イベントに対して、良いか悪いかをagentに伝える

Value function

Value functionは長期的に行動が悪いか良いかを評価する指標

model of the environment

所謂解きたい問題でしょうか。状態とそれに対するアクションがどういった形式で
定義できるのか。

つまり、これらを絵にするとこんな感じでしょうか。

f:id:tereka:20160530212129p:plain

強化学習で解ける問題

強化学習では解ける問題は以下のような問題です。

ロボットの動作最適化
強化学習 - Google 検索
迷路を解く
http://qiita.com/hogefugabar/items/74bed2851a84e978b61c
Alpha Go
AlphaGo - Wikipedia

つまり、状態を持ち、ゴールを持っており、試行錯誤で解ける問題について
解けるといえるでしょう。

また、n-Armed Bandit Problemも含まれ、こういった部分は勉強していきたいと思います。

参考文献

Richard S. Sutton and Andrew G. Barto「Reinforcement Learning: An Introduction」