旧バージョン(1.1.2)でpickle.dumpしたモデルの新バージョン(1.3.0)での読み込みについて

615 views
Skip to first unread message

SHIINA Hideaki

unread,
Sep 3, 2015, 7:43:28 PM9/3/15
to Chainer User Group
おはようございます。

chainerのバージョンを超えた学習済みモデルの読み込みで困っています。

chainerのv1.3.0が出たので、
sudo pip install chainer --upgrade
でアップグレードしたのですが、旧バージョン(1.1.2)でpickle.dumpしたモデルを新バージョン(1.3.0)で
読み込む際(pickle.load時)に以下のエラーが出ました。

    ImportError: No module named convolution_2d

確か、function系は、ディレクトリ構造が変わっていたなと思い、functionsディレクトリで
sudo ln -s connection/convolution_2d.py
を実行したら、上記のエラーは出なくなった(=ディレクトリが関係していることも分かった)のですが、
今度は、同じく pickle.load 実行時に

    AttributeError: 'module' object has no attribute '_reconstruct'

が出てしまいました。_reconstruct をchainerのgithubで検索しても何もヒットしなかったので、こちらに
相談に来ました。

chainerは、バージョンを超えてのモデルの読み込みはサポートしていないのでしょうか?
もし、そうならモデルを学習させた後はバージョンアップしてはいけないor全モデル学習し直しなのですか?
それとも、何かバージョンアップ時に注意点等あったのでしょうか?

よろしくお願いします。
椎名


kitanokumo

unread,
Sep 5, 2015, 6:50:57 AM9/5/15
to Chainer User Group
そこまでchainerの内部について理解しているわけではないので的外れな回答になってしまうかもしれません。

>chainerは、バージョンを超えてのモデルの読み込みはサポートしていないのでしょうか?
私の環境では1.2以前のモデルを1.3で読み込めています。

その読み込むモデルに「chainerのディレクトリに依存するコード」を含めてしまっていないでしょうか?
公式のmnistサンプルの、
model = chainer.FunctionSet(l1=F.Linear(784, n_units) , l2 = ..省略 )

こういうmodelファイルであればバージョンが変わってchainerのディレクトリ構造が変わっても読み込めるはずです。

しかし、公式以外のサンプルを見るとmodelに学習するコード自体を含めちゃっている場合が多いです。

model = SampleRNN(~~)
SampleRNNクラスに学習するコード等が含まれている

このmodel形式だとSampleRNN内にディレクトリ依存コードが入っていると読み込めなくなる可能性が。
modelの正しい使い方はFunctionSet()のみが入るべきなのかな、と思ってます。
間違っていたらすみません。

SHIINA Hideaki

unread,
Sep 5, 2015, 8:34:36 AM9/5/15
to Chainer User Group
えっ! 読み込めてるんですか?
pickle.load ですよね。

確認ですけど、読み込めているのは to_cpuしたあとのモデルですか。
私の2個目のエラーは、1.3で使わなくなったpycuda関連のエラーなので、to_gpuの状態のモデルは全滅かなと思っているので。


その読み込むモデルに「chainerのディレクトリに依存するコード」を含めてしまっていないでしょうか?
公式のmnistサンプルの、
model = chainer.FunctionSet(l1=F.Linear(784, n_units) , l2 = ..省略 )

思っいっきり上のようなコードです。
というより、サンプルの nin.py そのまんま(出力のクラス数を変えただけ)のモデルも、 1個目のエラー(ディレクトリが関係してるようなもの)が出ます。

読めるケースがあるということで、ますますわからなくなってきました。
Reply all
Reply to author
Forward
0 new messages