Masaponto's Blog

お勉強メモ

Python3による機械学習(数値解析)の実験を助けるツール -- Aizu AdC 2016

この記事はAizu advent calendar 2016 9日目の記事です。

前の人 @innocent_mame
次の人 @RomTin

ギリシャ-アテネからの投稿です!!! masapontoです。
今年は主に何をやっていたかって振り返ると、アニメを見てた 研究(機械学習)のためのPython3コードを書いてた気がします。 今回はその研究での実験を行うのために使っているツールやライブラリを紹介しようと思います。 なにか便利ツールやより良い使い方があれば教えてください。

Numpy、scipy、scikit-learn

Python機械学習といえば、こいつらなしには語れないでしょう。(深層学習だとTensorflow, Keras, Chainerもありますね) 自分で学習器を実装する場合はNumpy, scipyをを使ってます。scikit-learnの分類器にしたがって実装する(fit(X, y)に学習、predict(X)に分類を行う関数を実装する)と、scikit-learnで実装されている交差検定が使えて便利です。 こんな感じです。(こういう使い方するもんなのか、不安なのだが)
https://github.com/masaponto/Python-ELM
https://github.com/masaponto/Python-MLP

Anaconda3 on pyenv-virtualenv

pyenv-virtualenv
anaconda
これも有名ですね。anaconda3の環境だと数値解析に必要なライブラリ(僕がほしいNumpy、scipy、scikit-learn, pandas)は大体そろってます。

pandas

pandas
pandasは今のところ、あまりつかってません。 実験スクリプトで吐いたcsv形式の結果を、グラフにするのに使ってます。(with matplotlib) pandas.read_csvして、dataflame.plotすると楽です。
こんな感じ
graph.py · GitHub

参考
numpy/scipy/pandas/matplotlibメモ | mwSoft

Tabulate

tabulate

みなさんも実験結果の資料を作成するのには主にmarkdownを用いると思います。 tabulateを使えば、実験結果をかんたんにmarkdown table にできて良いです。
こんな感じ。
tabulate_sample.py · GitHub

doctest

doctest
さらっと雑なテストをするのに便利です。

slacktee

slacktee

実験スクリプトの実行が終わったら、ぼっちslackの実験チャンネルに結果を通知するようslackteeを使ってます。 以前kamebotなる、slackに投げるやつをを作ったりしてましたが、投げるのにコード書くのがめんどうなので最近はこちらをつかってます。

最後に

この記事を書いている間にJupyter notebookでいいんじゃね?って気持ちになってきました。 使っていた時期もあったのですが、さっとコードを書いて、試して、やり直して、というサイクルがやりにくくて、使わなくなってしまいました。(使い方が悪いのか) で、今は上で列挙したものを使ってやっています。なにか便利なツールがありましたら、教えてください!!

最近は、powerpoint(などのofficeソフト)スライドに実験結果の表を出すのが面倒なので、markdown -> tex -> pdf (or png via texclip)で貼り付けてやってます。 この辺を楽にできたらいいなーと感じています。(なんか作るか)

おまけ

f:id:masaponto:20161207094445j:plain f:id:masaponto:20161208022544p:plain

次の人は @RomTinです。よろしくお願いします。

TensorFlowと数式パーサで手書き電卓をつくった - Aizu Advent Calendar 2015

この記事はAizu Advent Calendar 2015 - Adventar 18日目の記事です。

前の人 @ababupdownba
Scala.jsを全力でオススメする - Qiita

次の人 @GUCC1_sp1ritu4l

タイトルどおり、手書き電卓を作ったのでそれについて書きます。

手書き電卓 dentaku

Webで見れます。これです

http://dentaku.herokuapp.com
masaponto/dentaku · GitHub

言語はPython 2.7.10です。
サーバにFlask0.10.1、学習にTensorFlow0.5.0を用いました。
CSSフレームワークはMaterial Design Liteを使っています。

使い方

左上のテキストボックスに数式を入力すると、パース(evalじゃないぞ)されて計算結果が下のテキストボックスに出力されます。
例えば、"30+12" と入力すると、"42"と出力されます。
うっかりコーヒーをキーボードにぶちまけて、キー入力ができなくなってしまっても安心してください。dentakuは手書き入力をサポートします!!
右側のキャンバスにマウスまたはタッチで "3" と上手に描くと、キャンバス上部に This is 3 ? と表示されると思います。
そのままYesボタンを押せば、テキストボックスに入力されます。
認識結果が間違えていた場合はNoボタンを押してください。無限に書き直すことができます。
今のところ、0 ~ 9の数字と、+、-、×、÷の演算子記号に対応しています。
Generatorと書かれたタブがありますが、それについては後述します。

TensorFlowによる手書き数字認識

手書き数字認識を行うにあたって、TensorFlow手書き数字データセットのMNISTを用いました。
学習方法はTensorFlowのエキスパート用チュートリアルと同じです。
こちらのページが参考になります。
http://qiita.com/haminiku/items/36982ae65a770565458d

また、Webアプリにするにあたってこちらのページを参考にさせていただきました。
http://d.hatena.ne.jp/sugyan/20151124/1448292129
http://qiita.com/ginrou@github/items/07b52a8520efcaebce37

演算子記号の認識

MNISTは0から9のアラビア数字の画像からなるデータセットです。
なので、MNISTのみを学習させただけでは、数字しか認識できません。
手書き電卓として機能させるには、+や-などの演算子の記号も認識させたいですよね。
という訳で、Tegaki Feature Vector Generator なるものを作りました。
dentakuのGeneratorタブをクリックしていただければ見れます。
左側のキャンバスに好きな記号を描いて、Generateボタンを押すと、右側のテキストエリアにキャンバスから生成された特徴ベクトルが表示されます。
MNISTと同様(?) 28×28次元で[0, 255]の範囲の特徴です。
生成した特徴ベクトルはDownloadボタンでcsv形式でダウンロードできます。
このデータとMNISTをくっつけて学習させれば、任意の記号を学習させられるという訳です。
今回は、+、-、× 、÷ の4つの記号をそれぞれ20個生成して学習をさせました。 データが少ないかと思っていましたが、それなりに学習、認識できてるかなと感じています。
どこかで手書き記号のデータセットが公開されていたら教えてください。

数式パーサ

数式パーサはHaskellサブセットであるFayを用いて作成したものを用いてます。
詳しくは下記のエントリを参照してください。

masaponto.hatenablog.com

おわりに

Webやディープラーニングについての知識が未熟なので、おかしい所を指摘していただければ幸いです。