blog.tmp.tokyo

No Promises Await at Journey's End

「ゼロから作るDeep Learning」をiPhoneのPythonistaだけで学ぶ(2)

お疲れ様です。前回記事の続きです。

tomohiko37-i.hatenablog.jp

将来的に自分は寝ていても会社に行ってお金を稼いで来てくれる素晴らしい AI の開発を夢見て日々勉強中です。

いきなりですが,「iPhoneのPythonistaだけで学ぶ」の部分は今回で終わりです。第3章でようやくニューラルネットワークに突入し,手書き数字認識の問題に入ったところで問題が発生しました。手書き数字の認識に MNIST という機械学習の分野で有名なデータセットを利用するのですが,早い話が実験データです。

これをダウンロードして画像データの NumPy 配列への返還をやってくれるスクリプトが用意されているのですが,この中の一部が iPhone 上の Pythonista で動作しません。というかエラーが出ます。「3.6.1 MNIST データセット」の節です。

import sys, os
sys.path.append(os.pardir)
from dataset.mnist import load_mnist

(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)

print(x_train.shape)
print(t_train.shape)
print(x_test.shape)
print(t_test.shape)

これを実行すると,以下のようなエラーになります。

Downloading train-images-idx3-ubyte.gz ... 
Done
Downloading t10k-labels-idx1-ubyte.gz ... 
Done
Downloading t10k-images-idx3-ubyte.gz ... 
Done
Downloading train-labels-idx1-ubyte.gz ... 
Done
Converting train-images-idx3-ubyte.gz to NumPy Array ...
Done
Converting train-labels-idx1-ubyte.gz to NumPy Array ...
Done
Converting t10k-images-idx3-ubyte.gz to NumPy Array ...
Done
Converting t10k-labels-idx1-ubyte.gz to NumPy Array ...
Done
Creating pickle file ...
Traceback (most recent call last):
  File "/private/var/mobile/Containers/Shared/AppGroup/.../Pythonista3/Documents/deep-learning-from-scratch/ch03/code0361.py", line 5, in <module>
    (x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)
  File "../dataset/mnist.py", line 106, in load_mnist
    init_mnist()
  File "../dataset/mnist.py", line 79, in init_mnist
    pickle.dump(dataset, f, -1)
_pickle.PicklingError: Can't pickle <built-in function _reconstruct>: import of module 'multiarray' failed

Python には Pickle という機能があり,実行中のオブジェクトをファイルに保存します。Java で言うところのシリアライズ化ですね。時間をかけて作ったオブジェクトを保存しておいて,次回実行するときはそのオブジェクトから処理を続ければ 2 回目以降は処理時間を短縮できます。その dump の処理でコケている様子。

なんとなく multiarray がどうのと言っているので NumPy のバージョンを新しくすればいけそうな気がするのです。実際に PC や mac で実行するとうまくいくので,NumPy のバージョンを調べてみると PC や mac では 1.11.x など新しいものを使用しています。Pythonista で使っている NumPy のバージョンは 1.8.0 でした。この差が原因かどうかはわからないのですが,いずれにしても同じバージョンにして問題を切り分けたいところです。

ただし,Pythonista については NumPy が最初から組み込まれていて追加で pip で入れてもそっちを見てくれないのです。あまり細かな設定とかもできないのでライブラリの参照パスとかも弄れそうにないため,現状 NumPy のアップデートについては保留です。

試しに Pickle の dump とその後の load を簡単なスクリプトで試すと Pythonista 上でも普通に実行できました。mac で作成した *.pkl ファイルのサイズが 54MB くらいだったので,大きいファイルの作成に失敗したのかもしれません。もしくは簡単なスクリプトは文字列でやってみたので,そのくらいはいけるのかもしれませんが,他のオブジェクトだとうまく保存ができないのかもしれません。

とは言ってもエラーの内容が import of module 'multiarray' failed なので,ファイルサイズ云々については違うような気がしています。import に失敗しているみたいなので単純にライブラリ関係でどこかに不整合があるのだと思います。

だが先へ進む

もうちょっと粘って原因を解析するのもいいのですが,あくまで目的は「自分の代わりに会社へ・・・」なので iPhone でできなきゃ mac でやればいいのです。正常に動作している環境があるので,そちらを使います。まあ mac の方がライブラリの追加や更新も自由にできるので都合はよいかもしれません。最後まで iPhone だけでやれれば一番よかったのですが,まずは先に進むことを優先します。