verilog書く人

自称ASIC設計者です。どなたかkaggle一緒に出ましょう。

chainer GUI designerを使ってchainerのコードを生成してみる

皆さんこんばんは。Chainer Advent Calender 2017の9日目の記事です。

(Advent Calendarに不慣れで、空の記事を公開していました、すいません、)

 

今回の記事は拙作のGUIクライアント(非公式)でネットを構築してchainerのコードを生成してみようというのが趣旨です。

GitHub - fukatani/ChainerWing: GUI deep learning IDE based on chainer.


ChainerWing自体はデータのハンドリングから、ネット構築、学習、予測まで(限られたタスクではありますが)、サポートされています。
今回はネット構築機能を使ってChainerのコードを生成してみます。
フル機能に興味がある方は、以前の記事を参考にしてください。

 

 本題に入る前にChainerWingについて少しだけ紹介させてください。


開発のきっかけと狙い


データセットの準備から、結果の可視化までできるディープラーニング専用のIDEみたいなものがあると便利なんじゃないか?というのが開発のきっかけです。
特に以下の四つの工程をGUIで開発者に楽をさせることを目標としています。

1. ネットの構築

TensorBoardにしてもchainerのグラフダンプ機能にしてもコードで書いて、ネットを可視化して確認する、ということをしています。
しかし、常々これは逆なのではないか、つまりGUI上でグラフを書き、コードが生成されるべきなのではないか?と思っていました。

2. Chainerコードの生成

開発者はネットを構築して学習曲線をして終わりではなく、コードを他のなにかに組み込むはず。
GUI上で予測を行えるだけではデプロイがやりづらいので、Chainerコードを生成して他のアプリに組み込みやすくしています。
内部では生成したコードをimportlibを使って動的にimportして学習を実行しています。

3. データセットの準備

なんだかんだいって、ディープラーニングを始めるうえで大変なのが、データセットの加工。
例えば入力数値のスケーリングや、トレーニングセットとテストセットの分割、画像データのオーグメンテーションなど。
また、正解値はラベルファイルを用意するのではなく、ディレクトリごとに各カテゴリの画像を入れる形にしています。

4. デバッグ

実行時にエラーが発生したノードが赤くなり、問題がどのノードかわかるようになっています。

 

準備(インストール)

Python3.5のインストール


Floppyが3.5で書かれている、というのが事情です。
生成コードはPython2.7でもPython3.4でも動きます。

chainerのインストール


わかりやすかったので、chainer advent calendar 2017の記事を引用してみます。

PyQt5のインストール
pip install pyqt5
ChainerWingのインストール 
git clone https://github.com/fukatani/ChainerWing.git
python setup.py install

 

実践編、Alexnetを作ってみよう


Taskによって、Funtionとレイヤが制限されています。Alexnetは画像分類用のネットワークなので、Train Configurationアイコンをクリックして、タスクをImage Classificationに切り替えます。

f:id:segafreder:20171024224612p:plain

f:id:segafreder:20171024224725p:plain


今回はAlexnetを作ってみます。

f:id:segafreder:20171209213441p:plain

(画像はChainerで各種CNNの実装からいただきました)

FunctionやLinkを作るためには、右のリストからドラッグオンドロップします。

見つからない時は検索窓に文字を打つと絞り込まれます。ネットの出力と入力をマウスでつなげます。

f:id:segafreder:20171024225942p:plain

各パラメータはクリックしたあとにキーボードで数字や、文字を打つと設定できます。

f:id:segafreder:20171209212758p:plain

LinkとFunctionには名前をつけられます。各オブジェクト上で右クリックしてRename を選択してください。
この名前は生成コードでも使われるので、わかりやすい名前にしておきます。

出来上がったネットがこちら。

f:id:segafreder:20171209225932p:plain

Compileボタンを押すと、Chainerコードが出力されます。(出力位置はTrain Configuration画面で設定可能。Working Dirに出力される。)

出来上がったコードがこちら。

 

class MyNet(chainer.Chain):

    def __init__(self):
        super(MyNet, self).__init__(
            l5=Linear(None, 4096, nobias=False),
            l3=Convolution2D(None, 384, 3, 1, 1, False),
            l0=Convolution2D(None, 96, 11, 4, 0, False),
            l7=Linear(None, 1000, nobias=False),
            l6=Linear(None, 4096, nobias=False),
            l4=Convolution2D(None, 256, 3, 1, 1, False),
            l1=Convolution2D(None, 256, 5, 1, 2, False),
            l2=Convolution2D(None, 384, 3, 1, 1, False),
        )

    def _predict(self, x):
        l0 = self.l0(x)
        f0 = relu(l0)
        f10 = LocalResponseNormalization(5, 2, x=f0)
        f1 = max_pooling_2d(ksize=3, pad=2, x=f10)
        l1 = self.l1(f1)
        f3 = relu(l1)
        f11 = LocalResponseNormalization(5, 2, x=f3)
        f2 = max_pooling_2d(ksize=3, pad=2, x=f11)
        l2 = self.l2(f2)
        f4 = relu(l2)
        l3 = self.l3(f4)
        f6 = relu(l3)
        l4 = self.l4(f6)
        f14 = relu(l4)
        f13 = max_pooling_2d(ksize=3, pad=2, x=f14)
        l5 = self.l5(f13)
        l6 = self.l6(l5)
        l7 = self.l7(l6)
        return l7

    def predict(self, x):
        return self._predict(x).data

    def predict_class(self, x):
        predicted = numpy.argmax(self.predict(x), axis=1)
        return numpy.atleast_2d(predicted).T

    def __call__(self, x, t):
        self.y = self._predict(x)
        self.loss0 = softmax_cross_entropy(self.y, t)
        reporter.report({'loss': self.loss0}, self)
        self.accuracy = accuracy(self.y, t)
        reporter.report({'accuracy': self.accuracy}, self)
        return self.loss0

うんまあ、ちゃんとAlexしてます。(__init__の引数の順番がデタラメだからソートしてえ


今後

とりあえず、自分で使ってみて、不便なところは直したい、


あとチンタラ開発している間に当初やりたかったことがガッツリsonyさんのNeural Network Consoleと被ったので思案中。
同じようなことやってもしかたないし。

・サポートするリンク、ファンクションの拡大。増やすのは簡単なのでお気軽にPRどぞ。
・Task増やす(物体検出かGANやりたい)
・既存のchanerプロジェクトを取り込めるようにしたいです。