[win7][python]chainer の mnist を動かす

注:7/7 release v1.1.0 では以下の現象は出ませんでした。

chainer に付属の example である mnist が
私の win7 環境では動きませんでした。
ネットに情報が見当たらなかったのですが、
きっとみんな python マスターだから困ってないのでしょうね…。
そこで修正してむりくり動かしたので、
記事にしてみますよ。

chainer のバージョンは 1.0.1 です。
モリモリ開発が進んでいて
日々バージョンアップされそうな勢いなので、
ご注意ください。

mnist を使う例は以下から落とします。
chainer/examples/mnist at master ・ pfnet/chainer ・ GitHub
https://github.com/pfnet/chainer/tree/master/examples/mnist

ちなみに、chainer のインストール自体は、
このページ
Windowsにすごいインストールしにくい、ではありません。

とあったので、どんだけ大変なのかと思っていましたが、
個人的には、それほどではなかったです。
caffe に比べたら100万倍楽かも。
h2o を使うために、Anaconda を導入済みだったからだと思います。
Anaconda まじおすすめ。
NumPy とか SciPy とか pip とか pandas とか、大概入っています。
h2o については、また別途書くかも。書かないかも。

話を元に戻すと、
使用するデータファイルである mnist.pkl は、以下からダウンロードして、
解凍せずに、gz のままで同じディレクトリに置きます。
http://deeplearning.net/data/mnist/mnist.pkl.gz

最初、mnist.pkl を解凍して、
mnist を動かしてみたら、
python のエラーが出ました。
どこが悪いのか、train_mnist.py を1行ずつ試したところ、
31 行目で引っかかりました。
>>> mnist['data'] = mnist['data'].astype(np.float32)
Traceback (most recent call last):
File "<stdin>", line 1, in TypeError: tuple indices must be integers, not str

mnist に 'data' とかいうキーはないね、と言われてます。

mnist だけ見てみます。
>>> mnist
((array([[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.],
...,
[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.]], dtype=float32), array([5, 0, 4, ...
, 8, 4, 8], dtype=int64)), (array([[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.],
...,
[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.]], dtype=float32), array([3, 8, 6, ...
, 5, 6, 8], dtype=int64)), (array([[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.],
...,
[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 0., 0., ..., 0., 0., 0.]], dtype=float32), array([7, 2, 1, ...
, 4, 5, 6], dtype=int64)))

'data' なんていう文字列は見当たらないような???

データ型を追うのは目的じゃないので、
train_mnist.py を変更することにしました。
以下を参考に。

bluewidz nota: mnist.pkl.gz の読み込み方
http://bluewidz.blogspot.jp/2013/02/mnistpklgz.html

mnist.pkl は解凍せずに使うことにしました。
train_mnist.py L28 .. L38 を変更。
import gzip
N = 40000 # 元の60000だとデータ数より多いらしいので減らした
ff = 'mnist.pkl.gz'
f = gzip.open(ff,'rb') #注:exblogの投稿の仕様上、閉じカッコを全角にしてあります
train_set, valid_set, test_set=six.moves.cPickle.load(f)
train_set_x, train_set_y=train_set
x_train, x_test = np.split(train_set_x, [N])
y_train, y_test = np.split(train_set_y, [N])
N_test = y_test.size


これでちゃんと動いたのでOKということにしました。
D:\Python27\archives\chainer-master\examples\mnist>python train_mnist.py
load MNIST dataset
('epoch', 1)
train mean loss=0.33063835158, accuracy=0.898124998361
test mean loss=0.162676717639, accuracy=0.947100001574
('epoch', 2)
train mean loss=0.153755561546, accuracy=0.95172500208
test mean loss=0.131504864115, accuracy=0.960300003886
('epoch', 3)
train mean loss=0.11874152357, accuracy=0.962600004375
test mean loss=0.113062846968, accuracy=0.965400006771
('epoch', 4)
train mean loss=0.0971574839624, accuracy=0.969350008518
test mean loss=0.103983323704, accuracy=0.967700006366
('epoch', 5)
train mean loss=0.0857273762824, accuracy=0.973425008357
test mean loss=0.101200945508, accuracy=0.972000008821
('epoch', 6)
train mean loss=0.0790844700066, accuracy=0.974600008726
test mean loss=0.104126119157, accuracy=0.972800009847
('epoch', 7)
train mean loss=0.0749579791015, accuracy=0.97680000931
test mean loss=0.0958447372471, accuracy=0.973500008583
('epoch', 8)
train mean loss=0.0661980926926, accuracy=0.978375010192
test mean loss=0.0982851918356, accuracy=0.973100009561
('epoch', 9)
train mean loss=0.0584314434149, accuracy=0.9810750103
test mean loss=0.113216444734, accuracy=0.969900010228
('epoch', 10)
train mean loss=0.0602908361913, accuracy=0.980450012088
test mean loss=0.0879984638083, accuracy=0.976200011373
('epoch', 11)
train mean loss=0.0514875223837, accuracy=0.983800010234
test mean loss=0.0894974586042, accuracy=0.975600011349
('epoch', 12)
train mean loss=0.0548883137996, accuracy=0.983050012439
test mean loss=0.102420077655, accuracy=0.974400009513
('epoch', 13)
train mean loss=0.0512076163373, accuracy=0.984175011665
test mean loss=0.100468366765, accuracy=0.974800007343
('epoch', 14)
train mean loss=0.0500191870244, accuracy=0.984925010055
test mean loss=0.0993473297404, accuracy=0.975400010943
('epoch', 15)
train mean loss=0.0470136474677, accuracy=0.984850009531
test mean loss=0.105845116437, accuracy=0.975900011063
('epoch', 16)
train mean loss=0.0477901911164, accuracy=0.984475011379
test mean loss=0.106810954099, accuracy=0.976200010777
('epoch', 17)
train mean loss=0.0459414152225, accuracy=0.985275010765
test mean loss=0.0922556833585, accuracy=0.978700011969
('epoch', 18)
train mean loss=0.0427814637575, accuracy=0.987350009829
test mean loss=0.106742422327, accuracy=0.9767000103
('epoch', 19)
train mean loss=0.0439296430166, accuracy=0.985900009423
test mean loss=0.100506027883, accuracy=0.978100011945
('epoch', 20)
train mean loss=0.0382296479004, accuracy=0.98825000897
test mean loss=0.109894825316, accuracy=0.978100010157

D:\Python27\archives\chainer-master\examples\mnist>


いいですねー。
学習で 98.8% で、
test データでも 97.8% 出てます。

chainer については、これからもうちょっと色々試してみます。
[PR]
by xiaoxia | 2015-07-01 17:47 | ソフトウェア | Comments(0)

ダメ女プログラマ&主婦&腐女子&バイオリン弾き


by 小霞