studylog/北の雲

chainer/python/nlp

chainerメモ9 保存するmodelに学習するコード等を含ませない

追記

この記事の内容は自分の勘違いだっただようで、不正確かもしれません。

1.2以前のモデルを1.3で読み込むと

ImportError: No module named 'chainer.functions.linear'

となる問題。modelで絶対使うLinearのディレクトリ構造が
chainer/functions/linear→chainer/functions/connection/linearに1.3で変わったのかな?
Linearを使ったmodelは1.3では読み込めないんじゃないだろうか。
下の本文では「FunctionSetだけならpickle化してもバージョン問わず読みこめる」という趣旨のことを書いてるんですが間違ってる可能性があります。ごめんなさい…。

となると、現時点ではバージョン1.2以前と1.3以後では学習済モデルは共用できないっぽい。うーん。1.4(October 14予定)で公式のモデル保存方法が実装されるらしいけれど本当は1.3で実装される予定だったのが延期になっちゃってるし、どうなることか。

以下本文

chainerのフォーラムで「以前のバージョンで作ったモデルを読み込めなくなった」という質問があった。そのモデルがどういうものなのかは書かれていなかったのであくまで推測で答えたんだけど、pickleで保存するmodelに学習するコード自体が含まれちゃっているのではないかと。

model = chainer.FunctionSet(l1=F.Linear(784, n_units),
                            l2=F.Linear(n_units, n_units),
                            l3=F.Linear(n_units, 10))

公式mnistサンプルのようなmodelならばpickleでシリアライズしてもバージョン間で問題になることは無いはず。多分。でも、

model = SimpleRNN(~~)

としてSimpleRNNの中で学習するコード等を含めちゃうとバージョン間で読み込めなくなる可能性が出てくる。

modelの公式の保存・読み込み方法を実装する予定の
New design of model structure · Issue #363 · pfnet/chainer · GitHub
の中にあるGoogleドキュメントを読むと、

Do not serialize metadata that is fixed by code outside of learning loop; that is a part of the program.
Serialized model should be agnostic on the loading method.
For example, it should be able to load onto CPU and GPU regardless of devices the original model resides on.

とあって、学習コードは含めちゃ駄目って書いてあるように読める。

もしそういうった諸々のコードを含めちゃうと、chainerのバージョン間もそうだし、python2系or3系、CPUorGPUといったユーザーの使っている環境によっては読み込めなくなるかもしれない。

なのでmodelには一番上のmnistサンプルコードのようにFunctionSetだけを含めるべき、だと個人的に解釈。