備忘録とか日常とか

学んだこととかを書きます。

Deeplearningライブラリ「Keras」でつまずいたこと

DeeplearningライブラリのKerasを使っているときにはまったことをいくつかメモ。
ほぼ自分用かもしれない


今までTheanoを使ってアルゴリズムの勉強かついろいろ実験していたのだが、
勉強にはなるものの一から新しいアルゴリズムを実装するのはなかなかしんどいので
Theanoのラッパーとして使えるKerasを使ってみた

他にも色々あるっぽいけど評判良さそうなので。。
そのうち浮気するかもしれん


ちょっと使って見たところ、何個か細かい点でつまずいたのでメモしておく。
バックエンドはTheanoしか使っていないのでTensorflowについてはわかりません

ラベルはバイナリベクトルで扱う

まずこれ。
keras.datasetsからmnistなどのデータセットを取ってこれる。
mnistの場合だと以下

import keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()

mnist.load_data()の戻り値はタプル*2

Xは(n_samples, row, column)という形のnp.arrayで、
yは0~9のint型の数値を持つ(n_samples,)という形のnp.arrayとなっている
Kerasはラベルを数値ではなく、0or1を要素に持つベクトルで扱うらしい
つまりあるサンプルに対するターゲットを「3」だとすると

[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]

みたいな感じにしなければならない。

これは以下のように解決できる。

from keras.utils import np_utils
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)

(n_samples, n_classes)というnp.arrayがそれぞれのyに代入される。

入力データは[0,1]の範囲に正規化しなければならない

これが一番わかりにくかった
mnistの場合だと,まず入力データはint型になっているので変換する
その後画素値の最大である255で割り算しておく

X_train = X_train.reshape(X_train.shape[0], 28, 28).astype("float32")
X_train /= 255.0

こうしないと一向に学習が進まない。
Theano使ってるときは特にこういった処理はしなくても学習できたので
判明するまで丸二日くらいかかった

ドキュメントのわかりやすいとこに書いといてほしいです。。

poolingのフィルタがはみ出る場合は端っこのピクセルを無視する

細かい点だけど。
Theanoでプーリングを行う場合はtheano.tensor.signal.poolを使うのだが
フィルタサイズやストライドに加えてignore_borderという引数をとる。
これは例えばフィルタサイズ(3,3)、ストライド(2,2)みたいな設定にしたときに、
特徴マップの端でフィルタがはみ出した場合の扱いを決定する引数である。
図の例↓

f:id:may46onez:20151221223401p:plain

ignore_border=Trueとすると、はみ出た分のプーリングは行わない
つまり上図の例だと出力の特徴マップは(2,2)となる

この引数が、TheanoのデフォルトではFalseになっているのが
KerasだとTrueになっている

あまり性能に影響は出ないと思われるが、特徴マップのサイズがあまりにも小さくなりすぎると
認識率が落ちることが(自分の経験では)多々あったので
自分でネットワーク構造を考える場合は気に留めといたほうがいいかもしれない。

シークバー処理中にValueErrorを吐かれる

Kerasのいいところの一つに、学習状況などをシークバーでお知らせしてくれる機能がある
こんなの↓

Epoch 1/20
60816/60816 [==============================] - 19s - loss: 0.1665 - acc: 0.9597 
Epoch 2/20
31200/60816 [==============>...............] - ETA: 8s - loss: 0.1583 - acc: 0.9612

あとどれぐらいで学習が終わるか、lossがどれぐらい減少しているか、
学習データに対する認識率はどうか、
validationセットを指定した場合はそれに対する認識率もリアルタイムで表示される。

非常に便利な機能なのだが、
たまに以下のようなエラーを吐くことがある

ValueError: I/O operation on closed file

これはipythonでのバグらしいのだが、
今のところこれを根本的に解決する方法がないらしい・・・
丸一日かけて学習していたモデルが途中で止まったらかなりげんなりするだろう。
現に自分はした。

とりあえずの解決策としては、model.fit()の引数にverbose=0とする
これでシークバーが表示されなくなるのでエラーは回避できるが、
せっかくの便利機能が使えなくなる。。


公式の対応に期待か。

半角/全角の変換をmac風にする(windows10, Linux)

先日のWWDC2016は個人的には残念な結果でした。。
ハードに関する情報は一切なく、iOSやらSiriやら開発者向けの内容が多かったです。
まあ「初めからそういう発表会だから!」と言われればその通りだけど・・・


以前からmacbook airを買おうと画策していたのですが
いよいよ買い時がわからなくなってきたので、
気分だけでもmac使ってる風になろう!
ということでタイトルの通り。


macではスペースキーの左右に英数/かなキーが用意されており、
半角/全角キー(キーボードの左上)まで手を伸ばす必要がありません。
windows/Linuxでは変換/無変換をそれらに割り当てることでmac風な入力が可能となります。
要はIMEのオンオフをそれらに割り当てるということ

慣れればそこそこ作業スピードが上がりそうです。
以下その方法↓


Linux

ubuntu14.04で確認。多分それ以外でも可能

Mozcのインストール

Linuxには標準で日本語入力機能が搭載されていないので、IMEをインストールします。
(ubuntu14.04には初めから入っていたので必要なし)

$ sudo apt-get install ibus-mozc

Mozcの設定

superキー(windowsキー)を押して「mozc」と打ち込み、"Mozcの設定"を選択。
「キー設定の選択」の欄の編集ボタンをクリック。

するとMozcキー設定というウィンドウが開くので、以下のように設定する。

  • モード「直接入力」、入力キー「Henkan」のコマンドを「IMEを有効化」にする
  • モード「入力文字なし」、入力キー「Muhenkan」のコマンドを「IMEを無効化」にする


設定後に新しくウィンドウを立ち上げて確認。
変換キーで全角、無変換キーで半角入力が可能となる。

何かの拍子に設定が狂って変換/無変換キーが使えなくなった時のために
全角/半角キーの設定は変更しないことをおすすめします。。

設定を戻したいときは「キー設定の選択」欄で「MS-IME」を選択すると元に戻ります。

Windows10

windowsキーを押してCortanaに「IME」と打つ。(ちょー便利!)
Microsoft IMEの設定」というのが出るのでEnter


開いたウィンドウで「詳細設定」ボタンを押す。


全般タブの編集操作の欄で、キー設定 -> 変更を押す。
するとキー割り当てのウィンドウが出てくる
こんなの↓

f:id:may46onez:20160623212321p:plain


あとは

  • 「キー」列が「変換」の行で、「入力/変換済み文字なし」列のところを「IME-オン」にする
  • 「キー」列が「無変換」の行で、「入力/変換済み文字なし」列のところを「IME-オフ」にする

これで完了。
windows10以外でもIME設定のところをいじればできるはず。


余談だがCortanaはすごい便利。(音声入力は知らん)
何か設定を変えたいときにキーワードを打って検索すると大体出てくる。
新スタートメニューもなかなかいい感じ。あんま使わないけど。


あとは仮想デスクトップ回りとかをもう少し洗練された感じにしてくれると使いやすくなるんだけどなー。
デスクトップ切り替えながらアクティブウィンドウ移動とか。
キー割り当てを変えられるとなお良いんだけどさすがに無理かな・・・

公式の対応に期待です。

BUMP OF CHICKENの初スタジアムツアー”BFLY” in 大阪 物販のコツ・ちょっとだけ感想

タイトルの通り!

BUMP OF CHICKENは今年20周年を迎えて,4月から初のスタジアムツアーを開始してます
大阪→愛知→福岡→神奈川という行ったり来たりのスケジュール(笑)

大阪・京セラドームでの初日ライブに行ってきたので記念に。


多少ネタバレ(?)を含む可能性があるので
今後のツアー参加予定の方はご注意ください。
演出については言及しません。

続きを読む

matlabとnumpy reshapeの違い その2(多次元配列)

以前もnumpy(python)とmatlabのreshapeという関数の仕様の違いについて書いた
may46onez.hatenablog.com

今度は多次元配列(3次元)で引っかかったのでメモしておく。

numpy.reshapeの仕様

numpyで一次元配列(ベクトル)から3次元の配列にreshapeすると以下のようになる。
例として3x4x2の配列を作る。

>>> a = numpy.arange(24)
>>> a.reshape((3,4,2))
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5],
        [ 6,  7]],

       [[ 8,  9],
        [10, 11],
        [12, 13],
        [14, 15]],

       [[16, 17],
        [18, 19],
        [20, 21],
        [22, 23]]])

これはmatlab風に書くと、

a(:,:,1) =

     0     2     4     6
     8    10    12    14
    16    18    20    22


a(:,:,2) =

     1     3     5     7
     9    11    13    15
    17    19    21    23

という配列である。
numpyでは要素を最後の次元から埋めるので(この場合第3次元, 3x4x2の2から埋める)
a(1,1,:)に0,1が入り、次にa(1,2,:)に2,3が入り...というふうに。

matlabの仕様

一方matlabで同じことをすると、

>> a = 0:23;
>> reshape(a, [3,4,2])

ans(:,:,1) =

     0     3     6     9
     1     4     7    10
     2     5     8    11


ans(:,:,2) =

    12    15    18    21
    13    16    19    22
    14    17    20    23

matlabでは要素を最初の次元から埋める
次元が増えても同じっぽい

解決法

ちょっと調べたけど一発でこの差異をなくす方法がわからない。。
2次元配列をちまちまreshapeしてからcat()で繋げるとか...?

もうちょっといいやり方があるような気もするけど...

Bengio先生著のDeep learning本が凄そう

ここ最近Deep learning(あるいは人工知能)関係の記事を目にしない日はない
そういっても過言ではないほど何かしらの情報が出回ってるように思う


正直言って機械学習の諸分野に興味はあるものの、
こうハイペースに畳みかけて来られるとちょっと勉強するのも億劫になってしまう。
Convolutional neural netだけに。。


今ではもうDeep learningや機械学習に関する色んな書籍やら解説スライドやらが出回っているので
勉強する環境はかなり整ったように思う、

基礎知識は知ってて当然として話を進めるものも多いように思う
線形代数や確率・統計論をはじめとするいわゆる数学的な知識だとか。

まあちゃんと一から教科書引っ張り出して勉強すればよいのだけども・・・


僕の場合、いざ線形代数とかを勉強してみても、
「で、これどう使うの?」
となることが多いです。理解力に乏しいので。。

Bengio先生ばんざい

そんな人のための画期的な本が今まさに出版されようとしてる
Bengio先生らのDeep learning

この本はDeep learningが現在のような脚光を浴びるようになった歴史から
機械学習に必要な数学的基礎知識、代表的なアルゴリズム
さらに最新の研究まで取り上げている。

ちょっとだけ読んでみたところ
基礎の数学部分では、本質的な説明がなされており
今まであやふやだった概念の理解に大いに役立った


あとこの言葉が印象に残った

Many mathematical objects can be understood better by breaking them into
constituent parts, or finding some properties of them that are universal, not causedby the way we choose to represent them.

決して専門家同士で意思疎通を図るためのものではありませんよ、ということらしい
おかげさまで機械学習における線形代数の本質が垣間見れたような気がしますよ。


現在この本は校正中らしく、もうじき出版になると思われる
ドラフト版は無料で見れる。
コピー対策のためにpdfは用意しませんて言ってるんだけど
ブラウザの印刷メニューから普通にpdf保存できるんだよな・・・いいんかな保存しても


Bengio先生といえばニューラルネットの第一人者として君臨されているお方です
そんな人の書いた本が無料で読めるんだから読まない手はない!
ただし全編英語!!

しばらくこれで機械学習と英語勉強しようと思います