2019年3月1日金曜日

SonyのNeural Network Libraries(NNabla)でnumpy_arrayの読み込み



研究室がいまだ決まってない(後数時間なんですけどね)中の人です。前に投稿したSTM32でduty比をDMAで転送する話でも少し触れた、SonyのNeural Network Libraries(NNabla)を使って、Fully Convolutional Networksをやってみようと思います。



 NNablaは元々Sony内部で使われていたライブラリを公開したものらしいです。(詳しくはここを見てくれ)実の話をすると、本来はNeural Network Console(NNC)を使いたかったのですが(GUIでネットワークを記述するとか面白そう)、npzファイルで保存されている手持ちのChainer向けデータセットを転用したかったので今回はNNablaを使ってみることにしました。
 NNablaは組込み向けを意識しているのか、量子化に関するレイヤーが標準で実装されているので、今までChainerでやってきたやつを転用しようと考えた次第です。

 とりあえずチュートリアルと先人たちの解説を読みあさりつつ、サンプルをやってみました。今回はPython3.6のIDLEを使用しているので、公式チュートリアルコピペだと動かないことがありましたが、IDLEで実行している人がいました。ラッキー


NNabla(Neural Network Libraries)のシンプルチュートリアルをPython3.5でやってみる。


 このコードを参考にしてtiny_digitsによる学習はできたのですが、今度は独自のデータセットに対応させる必要があります。
いろいろ考えても進まないので、このサンプルコードで使用されているtiny_digitsのデータ構造を見ていきます。...といっても実態はnumpy-ndarrayなので、shapeで配列の各次元の要素数を確認しました。(参考:The Digit Dataset)

入力(image):(1797,8,8)
出力(target):(1797,)

ここで、オレオレデータセットのフォーマットを確認すると、

入力:((データ数),3,32,64)
出力:((データ数),6,32,64)

おっ、これだったらオレオレデータセットも読み込めそう...なのか?次元数違うけど大丈夫か...?というわけで、NNablaの公式リファレンスに飛び込んでみる。すると、

nnabla.utils.data_iterator.data_iterator_simple

の欄にload_funcの例が載っており、それが(ch, h, w)の画像の読み出しになっていました。これはオレオレデータセットの構造とほぼ同じなのでいけそうです。
 とりあえずそれを参考にしつつデータ読み込みの関数を書いてみました。

def data_iterator_my_dateset(train, teach, batch_size=8, shuffle=False, rng=None):
    def load_func(index):
         """Loading an image and its label"""
         img = train[index]
         label = teach[index]
         return img, label
    return data_iterator_simple(load_func, train.shape[0], batch_size, shuffle, rng, with_file_cache=False)

とりあえずデータ読み込みはこれでできました。やったぜ。この辺の話をやっている人をインターネッツでは見かけなかったので、結構苦労しました。(これだけで3h吹き飛んでる)
 多分今度の話は学習部分(というよりも使い方がよくわからなかったsoftmax_cross_entropy)になりそうです。


©2018 shts All Right Reserved.

0 件のコメント:

コメントを投稿