TIM Labs

Chainer:粗い手書き数字データの読み込み

| コメント(0) | トラックバック(0)

今回は、読み込んで、Irisのときと同様に、画像のデータをX、教師データをYに読み込む。
前回は、出力が3つだったが、今回は数字の0〜9までで10個に変わるのを考えて、以下のように書き換えた。
 
# digitsデータの読み込み
from sklearn import datasets
digits = datasets.load_digits()
X = digits.data.astype(np.float32)
Y = digits.target.astype(np.int)
N = Y.size
Y2 = np.zeros(10 * N).reshape(N,10).astype(np.float32)
for i in range(N):
    Y2[i,Y[i]] = 1.0
このデータを学習データとテストデータに分割する訳だが、データ数が150から1797に増加したので、2/3を学習データに、1/3をテストデータにしてみた。

# 学習データ(xtrain,ytrain)とテストデータ(xtest,yans)に分ける
index  = np.arange(N)
xtrain = X[index[index % 3 != 0],:]
ytrain = Y2[index[index % 3 != 0],:]
xtest  = X[index[index % 3 == 0],:]
yans   = Y[index[index % 3 == 0]]
次に、一番肝心なモデルについて変更する。
Irisのときのモデルのノード構成は、4-6-3 となっていた。中間層が6ノードである。

digitsのとき、入力ノードは8x8の画像なので、64になる。
出力ノードは、0〜9の各値に対してノードがあるので、10になる。
中間層のノードであるが、64と10から適当な値を考えるべきである。
しかし、ここではとりあえず、64の半分の32を与えてみる。

中間層のノード数が変わっても、プログラム中で変更するのは、たった2個所である。
中間層のノード数に名前を付けてしまえば、一箇所にすることも可能だ。

# Define model
class DigitsChain(Chain):
    def __init__(self):
        super(DigitsChain, self).__init__(	
            l1=L.Linear(64,32),		# 1-2層
            l2=L.Linear(32,10),		# 2-3層
        )
        
    def __call__(self,x,y):
        return F.mean_squared_error(self.fwd(x), y)

    def fwd(self,x):
         h1 = F.sigmoid(self.l1(x))
         h2 = self.l2(h1)
         return h2
これでほぼ準備は出来たはずなので、走らせるのは次回にしよう。

トラックバック(0)

トラックバックURL: http://labs.timedia.co.jp/mt/mt-tb.cgi/559

コメントする

このブログ記事について

このページは、fujiが2017年2月 9日 00:00に書いたブログ記事です。

ひとつ前のブログ記事は「Chainer:ニューラルネットワークのモデルの基本」です。

次のブログ記事は「データ解析のための統計モデリング入門 確率分布と統計モデルの最尤推定 読書メモ」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。