半年ほどKerasを使ってみた感想など

※この記事は苫小牧高専 AdventCalendar-2016の5日目の記事です。

 はじめに

最近流行りのDeepLearningについての記事を書こうと思います。ただし、理論についてではなく、理論をプログラムに落とし込むためのツールに関するお話です。それも1つのフレームワークに関することなので、比較などではなく自分が使ってみた感想をつらつら書いていきます。

僕は4月から卒業研究でDeepLearningに関する研究をしており、PythonとDeepLearning用フレームワークKeras(バックエンドはTensorflow)な環境で色々コードを書いています。そこで、半年くらいKerasを使ってみていいなと思ったこと、苦しかったことを書こうと思います。テーマはなんでもいいってことだったので、刺さる人が少ないのは申し訳ないですが、この記事がきっかけで機械学習をKeras使って始めてみようみたいな人が出てきてくれたら嬉しいですね。

間違いなどありましたら優しく教えてください、お願いします。

 

Kerasとは

Kerasとは、「Pythonで書かれた、TensorFlowまたはTheano上で実行可能な高水準のニューラルネットワークライブラリです。 Kerasは、迅速な実験を可能にすることに重点を置いて開発されました。可能な限り遅れなくアイデアから結果に進められることは、良い研究をする上で重要です。」ということらしいです(公式ドキュメントより)。

Theanoは数値計算用のライブラリ、TensorFlowはGoogle製の行列計算と分散処理が簡単に書くことが出来るライブラリで、両者とも数値計算や行列計算の応用先として機械学習にも使われているという感じっぽいですね。

 Kerasはこれらのライブラリで機械学習のプログラムを作成しようとするとき、演算に関する複雑だったり煩雑なコードを書かずに簡潔にネットワークを記述し、アイディアを素早く実行出来るよところに落とし込もうというところに重点が置かれているようです。

 

Kerasのいいなと思うところ

ネットワークの記述が簡単であること

豊富な種類の畳み込み層やリカレント層、BatchNormalizationなどがAPIとして提供されているため、ネットワークの記述がとても簡単でした。TensorFlowとKerasで手書き文字の分類をするためのプログラムを書いてみると、Kerasのほうがネットワークの記述部分を簡潔に書くことが出来ます。

また、VGG-16やResNet50、Inceptionv3などの超有名なネットワークはKerasの中ですでに定義されており、簡単に利用することが出来ることも強みだと思います。

僕は卒業研究で初めてDeepLearningの勉強を始め、右も左もわからない状況でKerasに触れてみましたが、畳み込み層を使った手書き文字の分類をするネットワークなどの小規模なものは特に悩むことなく記述することが出来ました。

拡張性が高いこと

KerasではバックエンドにTheanoかTensorFlowを使うので、Kerasで記述されたプログラム内でもバックエンドの関数を利用することが出来ます。

なので、新たな活性化関数を設計したり、レイヤーを設計する際には、KerasのAPIとバックエンドのフレームワークを両方使って記述することが出来ます。

ここらへんがKerasのコンセプトでもあるアイディアを迅速に実行できるようにする、という点にも繋がるんでしょうね。

 

Kerasを使っていて苦しいこと

APIの挙動がよくわからない

KerasのAPIの中には、その挙動がよくわからないものがたまにあるので、GitHub等でフレームワークのコードを読みながら書かないといけない場合があります。

僕が一番ハマったのは、Modelクラスにあるfit_generatorという関数を使ったときでした。この関数は、学習に使うデータがメモリ上に乗り切らない際にPythonのジェネレータという仕組みを使って1つずつ学習用データを構成し、ネットワークに入力してくれるものです。このfit_generator関数を使って研究で作成したネットワークの学習を行うと、入力データに問題があるためネットワークに入力することが出来ないとエラーが出るけど、データに問題があるわけではありませんでした(未だに原因がわからない)。

そのため、Kerasのfit_generator関数とジェネレータを使わないで学習を行うfit関数のコードをお手本にオレオレでfit関数を作ることになり、これに非常に時間がかかってしまった(車輪再開発めっちゃキツい、設計がひどい)。

ただ、滅多なことがなければこのような状況にならないと思うので、あまり心配しなくてもいいと思う。

公式ドキュメントが英語版と日本語訳版で少し違う

これは仕方のないことかもしれないが、Kerasの作製者はアメリカの方で、英語版のドキュメントはバージョンが上がるたびに更新され、Kerasの仕様変更などについても正確に記されている。しかし、日本語版のドキュメントは英訳が間違っていたり、最新バージョンで追加された機能や変更箇所に関する記述がなかったりと信頼に欠ける部分があって時々辛くなってしまう。

実際にAPIを使ってみて少しでも「なんかおかしいな?」と思ったら英語版のドキュメントを頑張って読むことをおすすめします(あと余裕があればGitHubにあるコードも)。

バックエンドが違うと動かなくなる

Kerasでは最初に書いたとおり、TensorFlowとTheanoのどちらかをバックエンドに利用します。しかし、TensorFlowとTheanoでは引数の順番であったり、関数の若干の仕様の差異があるので、ある人がTensorFlowをバックエンドに使用して作成したコードをTheanoをバックエンドに使っている環境に持っていくと動作しなくなってしまいます。

ココらへんは互換性を担保するためにプログラム内でうまく工夫をする必要があるだろうから注意が必要でしょう。

 

まとめ

Kerasはネットワークの記述が非常に簡単なので、DeepLearning初学者にはとてもうれしいと思います(僕もめっちゃうれしかった)。また、KerasのAPIとバックエンドのAPIが共存出来るので、何か新しい活性化関数だったりレイヤーだったりを構築したい場合にもKerasは非常に有効な選択肢になると考えています。

あとは、僕のようなDeepLearning初学者が、とりあえずこの研究を再現したい!やDeepLearningな実験を行いたい!といったときにはKerasがとても便利だと思います。

 ただし、とても複雑な構造のネットワークを記述したいとき、根本的に新しい仕組みなどを実現したいときには、TensorFlowやChainerなどの他のフレームワークを選択するか、他の言語を使ったほうがいいのではないかと僕はこの半年間Kerasを使ってみて思いました。

 

最後まで読んでいただきありがとうございました。

以上、苫小牧高専アドベントカレンダー5日目「半年ほどKerasを使ってみた感想など」でした。6日目はeve_ykさんです!!よろしくお願いします!!

自作ケーブルのその後

 あの後どうなった?

ケーブル作った後、MMCXコネクタの付け根で断線したり接触が悪くなったりすることがたくさんあった。

 

故障の原因

断線や接触不良は以下の原因により発生したと考える。 

  • 半田付け技術が未熟すぎる
  • スミチューブなどの使い方が悪い
  • ケーブルが捻れたり引っ掛けてしまうことが多かった
  • メタルシェルとコネクタの隙間が狭すぎて無理な半田付けをせざるを得なかった

 

半田付けしたあと、自分で見ても汚いと思った。何度も線材とコネクタの半田付けを上手くやる方法を調べて練習してみたが、綺麗に出来なかった。こればっかりは練習するしかないなと思った。あと、スミチューブの上手い使い方もいろいろ作ってみたり人に聞いたりして探してみようと思う。

 

メタルシェルコネクターの構造的に、MMCXの脚とその上にかぶせる金属製のシェルが鑑賞してしまうため、それを回避しようといろいろな工夫をしてみたが、それが仇となって断線してしまうことがあった。 

 対策

メタルシェルコネクターを使うのをやめて、一般的なMMCXオスコネクターを使うことにした。見た目は悪いが、径の違うスミチューブを3種類ほど使ってコネクタにカバーをかけて使っている。

 

メタルシェルコネクター使ったいい感じのケーブルの作り方があったらぜひ教えてほしいです、待ってます。

Get Wildするやつ書いた


Rubyで作ってみました。afplayを使っているのでMacでしか動きません。



github.com


mp3直下にお好みのGet Wildを置こう。
"-h"で時間、"-m"で分、"-t"でGet Wildする時間を指定しよう。

ruby leaving_wild.rb -h 16 -m 30 -t 10

FreeChargeとかいうサービスからメールが止まらない

 今日の朝からずっとFreeChargeというインドのサービスから利用明細みたいなメールが届いている。登録した覚えがないぞって知らせたいけどそういうリンクが無いし、ヘルプのメールアドレスに送ってしまおうかって思ったけど自分の拙い英語力ではどうすることも出来ず...。

 インド人の方が間違って自分のアドレスを登録したかしてメールが来ているんだと思うんだけれど、その人は不便していないんだろうか...。

 早く登録情報が間違ったことに気付いて修正して欲しいところ。

SE215用のMMCXケーブル作った

経緯

4日前にそれまで使っていたNobunaga Labs社のTR-SC1がMMCXコネクタの付け根から断線したので代わりのケーブル探したけど、1本5kくらいのケーブルが部品さえ揃えれば3k弱で作れると分かったのでオヤイデ電気で部品購入して自作することにした。

 

部品とか工具とか

 使った部品とか工具は以下の通り。HPC-26Tはまた故障したときのことを考えて1.3mが2本作れるように3m買っておいた。 

部品
  1.  HPC-26T 黒(518円/m * 3m)
  2. MMCX用メタルシェルコネクター(1404円)
  3. アンフェール製スペーサー付きステレオプラグ(496円)

送料込みで総額4536円、これで1.3m作るなら2573円。この値段でオヤイデのケーブルと同等のものが作れるなら安いと思う(手間はかかるけど)。

工具
  1. はんだごて
  2. ニッパー
  3. ワイヤーストリッパー
  4. ラジオペンチ
  5. ヒートクリップ

今回学校の実験以外で初めてワイヤーストリッパー使ったけどすごく便利だった。

 

出来上がったもの

出来上がったケーブルがこんな感じ。

f:id:toshiemon18:20160109184504j:plain

 

 ただ、どこで間違ったのかはもうわからないけどLとRとでコネクター1個分くらいの長さの違いが出てたのですごくショックだ...。

 まあ使う分には問題ないし次作るときは気をつけようと思う...。

 

肝心の音

正直良くわからないので特に書かない。自分で作って聴いて欲しい。