Chainer の MNIST サンプルを試す

草津よいとこ 一度はおいで

ア ドッコイショ

お湯の中にも コーリャ 花が咲くヨ

chainer chainer

(草津節 feat. Chainer)

概要

深層学習のフレームワーク Chainer の MNIST を使ったサンプルスクリプトを試してみました。

MNIST は手書きの0~9の数字画像のデータセットを分類するための教師データです。

このサンプルはMNISTを使った多層パーセプトロン (MLP) の実装例なんですが、コード構成をじっと眺めているうち、net.py を拡張すれば、別の方式に変更できそうなことに気が付きました。

今回は、多層パーセプトロン (MLP) に加えて、単純パーセプトロン (SP)と畳み込みニューラルネットワーク (CNN) を追加しました。そして、train_mnist.py が標準出力に表示する各 epoch ごとの "accuracy" と "loss" の推移を比較してみました。

MNISTサンプル

今回試した MNIST サンプルのオリジナルはこちらにあります。

重要なスクリプトは以下の通りです。

スクリプト 概要
data.py MNISTのデータセットを読み込む。手元にデータセットがないときはネットからダウンロードする。
net.py ニューラルネットワークのクラスを定義する。
train_mnist.py MNISTのデータセットを net.py のニューラルネットワークで学習する。

使用したニューラルネットワーク

MNIST サンプルに付属の net.py に SP と CNN 用のクラスを追加しました。

import chainer
import chainer.functions as F
import chainer.links as L

class MnistMLP(chainer.Chain):

    """An example of multi-layer perceptron for MNIST dataset.

    This is a very simple implementation of an MLP. You can modify this code to
    build your own neural net.

    """
    def __init__(self, n_in=784, n_units=1000, n_out=10):
        super(MnistMLP, self).__init__(
            l1=L.Linear(n_in, n_units),
            l2=L.Linear(n_units, n_units),
            l3=L.Linear(n_units, n_out),
        )

    def __call__(self, x):
        h1 = F.relu(self.l1(x))
        h2 = F.relu(self.l2(h1))
        return self.l3(h2)

# ここまでオリジナルのまま。

# ここから追加したクラス

class MnistSP(chainer.Chain):

    """An example of simple perceptron for MNIST dataset.

    """
    def __init__(self, n_in=784, n_out=10):
        super(MnistSP, self).__init__(
            l1=L.Linear(n_in, n_out),
        )

    def __call__(self, x):
        # param x --- chainer.Variable of array
        return self.l1(x)

class MnistCNN(chainer.Chain):

    """An example of convolutional neural network for MNIST dataset.
       refered page:
       http://ttlg.hateblo.jp/entry/2016/02/11/181322

    """

    def __init__(self, channel=1, c1=16, c2=32, c3=64, f1=256, \
                 f2=512, filter_size1=3, filter_size2=3, filter_size3=3):
        super(MnistCNN, self).__init__(
            conv1=L.Convolution2D(channel, c1, filter_size1),
            conv2=L.Convolution2D(c1, c2, filter_size2),
            conv3=L.Convolution2D(c2, c3, filter_size3),
            l1=L.Linear(f1, f2),
            l2=L.Linear(f2, 10)
        )

    def __call__(self, x):
        # param x --- chainer.Variable of array

        # 以下のような変換が必要
        x.data = x.data.reshape((len(x.data), 1, 28, 28))

        h = F.relu(self.conv1(x))
        h = F.max_pooling_2d(h, 2)
        h = F.relu(self.conv2(h))
        h = F.max_pooling_2d(h, 2)
        h = F.relu(self.conv3(h))
        h = F.max_pooling_2d(h, 2)
        h = F.dropout(F.relu(self.l1(h)))
        y = self.l2(h)
        return y

Convolution2D の入力がわかりにくかった。

学習を行うスクリプト train_mnist.py は使用したニューラルネットワークのグラフデータを dot 形式で出力してくれます。graphvizPNG に変換しました。リンクしときます:

MnistSP のグラフ

MnistMLP のグラフ

MnistCNN のグラフ

結果

ざっくりいうと、accuracy (高いほど良い)では SP が 0.93、MLP が 0.98、CNN が 0.99。 loss (低いほど良い)では SP が 0.26、MLP が 0.1、CNN が 0.05。

というわけで MNIST の手書き数字の認識において、今回検証した中では CNN が最も優れた方式だということを確認できました。

accuracy loss

リンク

Chainer

CNNの実装で参考にしたページ

コードはこちらにまとめておいてます

諸星大二郎劇場1『影人』(ビッグコミック増刊2016.6)

現在発売中のビッグコミック6月増刊号に、諸星大二郎劇場I 『影人』(えいじん)が掲載されました。

中国の民話風というか、諸怪志異の系統の作品です。

これ、シリーズ化されそうな雰囲気なんですが…。
ビッグコミックの増刊号で数ヶ月おきに連載という、非常に気の長い構想なのかしら(^o^;
楽しみにしております♪

表紙。
f:id:bunji2:20160521195052j:image

タイトルページ。
f:id:bunji2:20160521195116j:image

「BOX〜箱の中に何かいる」第8話

月刊モーニングtwoの7月号に、「BOX〜箱の中に何かいる」第8話が掲載されてます。

 
前回までのあらすじ
パズルが解けないふりをしていたために箱に囚われた山内の体は、変容したままばらばらになってしまった。少女によると、怪物たちは、山内のような人間のなれの果てらしい。そして、パズルを解くと貰える「カード」が全員分ないと、誰も外へは出られないという…。興子はまた姿を消し、光二たちは、谷夫妻の入った箱を運びながら先に進む。気になるのは、その時によって開いたり開かなかったりする扉があることだ。

登場人物
角多光二(かどたこうじ)
高校2年生。2年前に兄が交通事故で死んで以来、母親が鬱状態に。何者かから送られてきた箱根細工の箱を開けたときから、身の回りで怪現象が頻発する。
益田惠(ますだめぐみ)
高校2年生。送られてきたルービックキューブ的なパズルを解いたことにより、♂として大事な部分が消え…。
神宮智恵子(じんぐうちえこ)
霊感少女。ゴスロリの服を愛用。スマホに届いたパズルを解いた後、頭の一部が消失。
甲田信一郎(こうだしんいちろう)
建築家。
谷寛一・八重子(たにかんいち・やえこ)
彼らに送られてきた「迷路」を惠が解いた後にそれぞれの半身が消失かつ融合したように。いつの間にか、二人まとめて人形ケースのような箱に閉じ込められ、陳列されていた。
山内誠(やまうちまこと)
教師。郷土史研究家でもある。送られてきたクロスワード・パズルが「解けないふり」をしていたため箱に襲われ、取り込まれてしまった。
興子(きょうこ)
正体不明の女。彼女だけは「招待されて」おわず、自らの興味からここに来たという。一連のなぞの真相を知っているような…いないような…。
 
表紙。
f:id:bunji2:20160521125655j:image
 
タイトルページ
f:id:bunji2:20160521125705j:image
 
今月の男子。
f:id:bunji2:20160521125740j:image
f:id:bunji2:20160521125750j:image
ゴスロリ少女とどつきあいました。
 
今月のキョーコ。
f:id:bunji2:20160521125803j:image
出番なし(T_T)
 
今月の諸星先生
f:id:bunji2:20160521125716j:image
f:id:bunji2:20160521125725j:image
息子さん、パズルが得意なのですね(^o^)
 

『夢みる機械』ドラマ化

諸星大二郎先生の『夢みる機械』がドラマ化され、
フジテレビ系「世にも奇妙な物語’16春の特別編」(5月28日午後9時)で放映とのことです。


窪田が主演する「夢みる機械」は、日本を代表するSF・伝奇漫画家諸星大二郎の名作。漫画家志望の青年が、言い争いを発端に母親が機械であることを知り、次々と驚きの事実に追い詰めれていく。「奇妙」初出演の窪田は、小さいころから家族で見ていた番組とあって喜びもひとしお。「いちばん喜んでくれたのは母です。母の夢をかなえることができて大変幸せに感じます」と話し「全力で立ち向かいました」。

原画展 マッドメンの世界(コミティア116)

東京ビッグサイトで開催のコミティアにて、諸星大二郎先生の原画展を見てきました。

f:id:bunji2:20160505131729j:image

昨年の中野のリトルハイて展示されていたものと同じ内容でしたが、生原稿の迫力は何度見てもスゴイ!

f:id:bunji2:20160505131742j:image
コドワ・波子と並んで撮影できるパネルがありました。

加筆。書き忘れてました。

『鳥が森に帰るとき』の原稿、セリフの中の飛行機のルビに手書きで「バルス」と書かれていました。
撮影禁止だったので写真撮れなかったです。
後で書き加えたものと思われます。

「BOX〜箱の中に何かいる」第7話

現在発売中の月刊モーニングtwoの6月号に、諸星大二郎先生の「BOX〜箱の中に何かいる」第7話が載っています。

表紙。
f:id:bunji2:20160423134623j:image

タイトルページ。
f:id:bunji2:20160423134638j:image

今月のキョーコさん。
バラバラにされた恵くんを助けました。
f:id:bunji2:20160423134655j:image
f:id:bunji2:20160423134709j:image

山内さんの方は助かりませんでした。
f:id:bunji2:20160423134724j:image

今月の男子。
f:id:bunji2:20160423134744j:image
f:id:bunji2:20160423134757j:image

相変わらず仲良しです♪(^o^)

そして!今月の諸星先生。
f:id:bunji2:20160423134808j:image
f:id:bunji2:20160423134822j:image

…それが正解かもしれません(;´∀`)

萩尾望都SF原画展

萩尾望都先生の原画展を見学してきました。

f:id:bunji2:20160417140054j:image

f:id:bunji2:20160417140106j:image

f:id:bunji2:20160417140119j:image

美しい原画に圧倒されます。

私はアニメの「11人いる!」から萩尾作品に入ったもので、その原画を見れたことは特に感慨深いものがあります。

今回の展示はSF作品のみということで、萩尾先生の代表作「ポーの一族」は含まれていませんでした。

吉祥寺美術館で5/29まで開催してます。