2016年2月18日木曜日

VMWare PlayerでIPv6通信

VMWare Playerで動かした仮想マシン上でIPv6通信を行った時のメモ。

VMWareのバージョン

7.1.0 build-2496824

仮想マシン1

Windows 7

仮想マシン2

Red Hat Enterprise Linux Server release 6.0 (Santiago)

やったこと

  • 仮想マシン1,2のping6
  • ホスト(Windows7)と仮想マシン1のping6
  • ホスト(Windows7)と仮想マシン2のping6

結果

  • 仮想マシン1 => 2 へのping6 成功
  • 仮想マシン2 => 1 へのping6 成功
  • ホスト=>仮想マシン1へのping6 成功
  • 仮想マシン1=>ホストへのping6 失敗
  • ホスト=>仮想マシン2へのping6 成功
  • 仮想マシン2=>ホストへのping6 失敗

何故かよくわからないが、仮想マシン=>ホストへのping6はUnreachableだった。
Wiresharkで見ていたところ、仮想マシンからNeighbor solicitationsが発行された後に
ホストから応答があるはずのNeighbor advertisementsが出ていなかった。
Vmware Playerのせいなのか、設定が正しくないのかは不明。

なお、IPv4でのpingの場合は、上記の全経路で通信に成功した。

重要そうな設定

ネットワークアダプタの設定をHost-onlyにした時のみ、ping6が成功した。
BridgedやNATではダメだった。

仮想マシン上のFirewallは切っておいた。ホストはOFFにする権限がなかったので切っていない。
仮想マシン => ホストのping6が通らないのはこれが原因かもしれない。ただし仮想マシン間のping6は双方向で通るので、イマイチよくわからない。



2016年2月3日水曜日

Chainerを使ったMNIST Handwitten Digit Classifier

Chainerを使って手書き数字の認識器を作ってみた。

MNIST Handwritten digit classifier


Herokuで動かしているが、学習自体は別の環境で行った。
ChanierはモデルのSerialize機能があるので、それをHerokuにデプロイして利用している。

マシンリソースがあまりないので、エポック数とか削ってしまったが、まあまあきちんと認識してくれてるような気がする。

ソースコードはGithubを参照

html部分はこちらのソースコードを流用させていただきました。

HerokuでChainerを動かそうとして成功したときのメモ

ChainerをHerokuで動かして成功したのでそのメモ。


Google App Engineでは、GAEにプリインストールされているnumpyのバージョンや.soファイルを利用したpythonライブラリのデプロイ制限などのために上手く動かなかったが、Herokuでは無事に動いた。

1. Chainerのバージョンは1.5.1以降で

Herokuでは基本的にpipでインストールできるものは、何でも利用できるようでGoogle App Engineよりも自由度が高い。

ただし、Herokuの環境ではlibhdf5-devなどのh5pyのインストールに必要な開発モジュールが入ってないようで、h5pyだけはインストールできなかった。

幸運なことにChainer 1.5.1からはh5pyがオプショナルになっていたようで、これは大きな問題にならなかった。

githubを見ても特に変更の理由はわからないが、もしこのような事態を想定して変更してたのならば、開発者たちの慧眼は賞賛ものである。


2. その他の環境

下記のバージョンを利用。

Flask==0.10.1

numpy==1.9.2

six ==1.9.0

chainer==1.6.0


またデフォルトでは2系のpythonを3系に変更するためにruntime.txtに下記のように書く。なお、Chainerは2.7にも対応しているので、2系のままでもたぶん動くが未検証。

python-3.4.0

3. ソースコード



2016年1月24日日曜日

Google App EngineでChainerを動かそうとして諦めた時のメモ

表題どおり、Google App EngineでChainerを動かしてみようと思ったが、上手くいかなかった。
そのときのメモを書いておく。


1. numpyのバージョン

GAEはデフォルトでnumpyが用意されているが、これのバージョンは1.6.1
しかしChainerでは1.9,1.10が前提のようなので、これは使えない。

実際に、1.6.1のまま動かそうとすると、numpyのfull関数がないとかでエラーが出た。
githubのソースを見る限り、1.6.1では確かにfullはない様子。

そのため、自前のライブラリとしてnumpyの1.10を用意し、GAEにデプロイする。

2. 自前ライブラリのデプロイ


デプロイ対象のアプリケーションのルート直下にlibという名称のファイルを用意する。
そのlib以下にnumpyをインストールする。

$ pip install -t lib numpy

chainerとchinerが必要とするh5pyもついでにインストールする

$ pip install -t lib h5py


$ pip install -t lib chainer



そして、同じくルート直下にappengine_config.pyという名称のファイルを作成し、下記の内容を記載する。

from google.appengine.ext import vendor
# Add any libraries installed in the "lib" folder.
vendor.add('lib')

3. SDKで実行
SDKで実行したところ、下記のエラーが出た。


  File "<app path>\lib\numpy\core\__init__.py", line 14, in <module>
    from . import multiarray
ImportError: cannot import name multiarray

multiarrayというモジュールがないとのこと。
ディレクトリを見てみるとmultiarrayはsoファイルでできたモジュールだった。

Google App EngineのドキュメントにははっきりとC extensionがだめと書いてあるので、おそらくこいつは動かないのだろう。

You can add any third-party library to your application, as long as it is implemented in "pure Python" (no C extensions) and otherwise functions in the App Engine runtime environment. The easiest way to manage this is with a ./lib directory.

ということでここで諦めた。
pythonのバージョンも2.7だし、やっぱグーグルさん的にはもうGoogle App Engineに力入れる気ないのかなあ。

2016年1月4日月曜日

英辞郎の単語帳をKindleみたいなフラッシュカードにするChrome拡張公開

スペースアルクの英辞郎の単語帳をKindleのフラッシュカードのように使ってみたくなり、Chrome拡張を作ってみました。



InstallはChrome Web Storeのこちらから。
アイコンを押すと、単語帳からデータの取得し、ランダムな順序で単語を表示します。
はじめは単語しか表示されてませんが、クリックすると辞書を引いたときの定義が表示されます。



Undermineをクリックすると..


辞書の中身が表示されます。

右上のnextを押すと次の単語へ、previousを押すと一個前の単語へ。
単語を覚えたら「単語帳から削除する」をクリックして削除できます。


前提条件
  • 英辞郎on The web Pro(有料)のアカウントを持っている必要があります。
  • また拡張を起動する前にあらかじめログインをしておいてください。

2015年12月27日日曜日

SVN(Support Vector Machine)を調べたときに役立ったサイトメモ

Support Vector Machineの原理を調べてるときに役立ったサイトを張っておく。

一昔前に一世を風靡した手法だが、まじめにロジックを追うと数学的な知見が結構使用されていた。

どれか一個を見れば、完璧!見たいのは残念ながらなかったが私の場合は下記のサイトをいったりきたりしながら読み込んでいったら大体理解できた。

もちろん、これ以外のサイトも多数見たが、よくわからなかったり、明らかに間違ってたりといった質的にいまいちなサイトも多くあったことを記しておく。


名古屋大学の人が書いた説明
短くまとめられているので、全体像を把握するのに役立った。
付録として掲載されているKKT法の例も有益。

静岡理工大の人が書いた資料
一般的なSVNでは多次元を前提として説明されているので、数式が若干追いづらい。
このサイトでは、入力が2次元であることを前提に説明しているので、論理展開がわかりやすい。
数学的厳密性は気にしてなかったので非常に重宝した。

個人的には、2次元で説明しているために、マージンの距離の求め方が、単に点と直線の距離の距離の公式を使って求めているに過ぎないことがわかり、これのおかげでつまづきが解消された。マージンの距離については、必ずしもそういう説明をしてくれないサイトも多かったんだよね。

産業技術総合研究所の人が書いた資料
一番教科書的に使える資料。ただし、式の展開などはわかっていることが前提でさっくり飛ばしているので、初学には向かない。俗に言うインデックスとして資料するのにお薦めな資料。

海洋大学の人の書いた資料
KKT方について調べるのに役立った。

2015年12月23日水曜日

Deep Learning用のモデルを簡単に作成できるLabellioを使ってみた

本記事は Deep Learning Advent Calendar 2015 22日目の記事です。
AlpacaがリリースしているDeep LeaningのWebサービスにLabellioというのがあります。これを使うと、画像データを与えるだけで、自動的にDeep Learningで学習を行いモデルを作成することができます。モデルはもちろんエクスポート可能であり、著名なDeep LearningフレームワークのひとつであるCaffeに対応した形式でエクスポートすることができます。

学習はすべてLabellioの用意するリソース上で行われるので、自前で用意するのは訓練用の画像データとそのラベルだけでよいという優れものです。
訓練データは自前で用意したものをUploadすることもできますし、とりあえず試したいのであればLabellioが提供するAPIを利用してFlickr/Bingから訓練データを自動的に取得させることもできます。

今回は、Flickrから取得したデータを使ってみました。例としてフルーツの画像分類器を作成してみます。

まずモデル名として"Fruits"と指定します。
そして訓練データをFlickr上から取得するように指定します。

SourceとしてFlickrを指定。
LabelにOrange, Apple, Bananaを入力する。



ラベルの入力が終わったらAddを押す。





ここでNextを押すと学習用の処理がLabellioにenqueueされる。



後はTrainingが終わるのを待つ。
今回の場合は150個程度の訓練データしか使ってないようなので、数分程度で学習が終了した。


学習が終わった後、適当にGoogleで見つけたバナナの画像をこの分類器に与えてみる。




結果が出るまで少し待つ




それ程時間がかからずに結果が出る。
バナナな確率0.6。思ってたより数値が良くないのは訓練データが少ないせいだろうか。
そういえば訓練結果のAccuracyも0.57だった。

もう少しいろいろデータを用意して試してみたいところだ。

使ってみた感触


もはや画像データを渡せばいいだけなので、Deep Learningが何なのかといった知識がまったく不要である。また学習のリソースごと提供してくれているのが非常にポイントが高い。フレームワークはオープンソースで無料なのがいくつも存在するが、学習用のリソースはそうはいかない。

営利目的でしっかりとしたものを作るのならともかく、単に学習を目的としていたり、趣味でちょこっと作りたいときなど、学習リソースの調達はネックになることが多いであろう。

そのなかで学習環境もセットで提供されているLabellioは非常に存在価値が高いといえる。