質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

6452閲覧

chainerで学習結果の保存・読み込みを行いたいが、object has no attribute エラーが出てしまう

LaLaLand

総合スコア107

Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/11/14 09:21

編集2017/11/14 09:26

Python3、Chainerでニューラルネットワークの勉強をしています。
適当なサンプルコードを書いて、学習結果の保存・読み込みを行おうと思っています。
学習自体は目的ではなく、あくまで保存・読み込みの勉強が目的です。

python

1# モデルの読み込み(存在する場合) 2modelFileName = "kakezan-model.npz" 3if os.path.exists(modelFileName): 4 model = MyChain() 5 serializers.load_npz(modelFileName, model) 6else: 7 model = MyChain() 8 9# optimizerの読み込み(存在する場合) 10optimizerFileName = "kakezan-optimizer.npz" 11if os.path.exists(optimizerFileName): 12 optimizer = optimizers.SMORMS3() 13 serializers.load_npz(optimizerFileName, optimizer) 14else: 15 optimizer = optimizers.SMORMS3() 16 optimizer.setup(model)

上のようなコードで、optimizerを読み取ろうとしたのですが、以下のエラーが出て読み込めません。

Traceback (most recent call last): File "prac.py", line 56, in <module> serializers.load_npz(optimizerFileName, optimizer) File "/usr/local/lib/python3.5/dist-packages/chainer/serializers/npz.py", line 134, in load_npz d.load(obj) File "/usr/local/lib/python3.5/dist-packages/chainer/serializer.py", line 82, in load obj.serialize(self) File "/usr/local/lib/python3.5/dist-packages/chainer/optimizer.py", line 445, in serialize self.t = serializer('t', self.t) AttributeError: 'SMORMS3' object has no attribute 't'

どのようにしたら読み込めますでしょうか?

教えてください。

以下、コードの全文です。

python

1 2from chainer import Chain 3from chainer import cuda, Function, gradient_check, Variable, optimizers, serializers, utils 4import chainer.links as L 5import chainer.functions as F 6import numpy as np 7import os 8 9 10 11class MyChain(Chain): 12 def __init__(self): 13 super(MyChain, self).__init__( 14 l1 = L.Linear(2, 10), 15 l2 = L.Linear(10, 10), 16 l3 = L.Linear(10, 1)) 17 18 def __call__(self, x, y): 19 xv = Variable(x) 20 yv = Variable(y) 21 pr = self.predict(xv) 22 return F.mean_squared_error(pr, yv) 23 24 def predict(self, x): 25 h1 = self.l1(x) 26 h2 = self.l2(h1) 27 h3 = self.l3(h2) 28 return h3 29 30def createData(max, N): 31 # 適当にデータを作って掛け算を学習してみる。 32 xs1 = np.linspace(-max, max, N).astype(np.float32) 33 xs2 = np.random.normal(0, max, N).astype(np.float32) 34 return np.c_[xs1, xs2], np.c_[xs1*xs2] 35 36 37rangeMax = 13.5 38 39N = 1200 40batchSize = 10 41xtrain, ytrain = createData(rangeMax, N) 42xtest, ytest = createData(rangeMax, 1000) 43 44 45# モデルの読み込み(存在する場合) 46modelFileName = "kakezan-model.npz" 47if os.path.exists(modelFileName): 48 model = MyChain() 49 serializers.load_npz(modelFileName, model) 50else: 51 model = MyChain() 52 53# optimizerの読み込み(存在する場合) 54optimizerFileName = "kakezan-optimizer.npz" 55if os.path.exists(optimizerFileName): 56 optimizer = optimizers.SMORMS3() 57 serializers.load_npz(optimizerFileName, optimizer) 58else: 59 optimizer = optimizers.SMORMS3() 60 optimizer.setup(model) 61 62for epoch in range(120): 63 perm = np.random.permutation(N) 64 65 for i in range(0, N, batchSize): 66 # ランダムにbatchSize個のデータを取得 67 x_batch = xtrain[perm[i:i + batchSize]] 68 y_batch = ytrain[perm[i:i + batchSize]] 69 70 model.zerograds() 71 loss = model(x_batch, y_batch) 72 loss.backward() 73 optimizer.update() 74 75 if 0 < epoch and epoch % 30 == 0: 76 loss = model(xtest, ytest) 77 print(loss.data) 78 serializers.save_npz(modelFileName, model) 79 serializers.save_npz(optimizerFileName, optimizer) 80 81 82 83

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

https://github.com/chainer/chainer/blob/master/chainer/optimizer.py#L342

Optimizerにattribute 't'が作成されるのはsetupメソッドの中なのですよね。

なので、デシリアライズの前にsetupしておかないといけないのではと思いました。


また、

http://docs.chainer.org/en/stable/reference/core/generated/chainer.Optimizer.html#chainer.Optimizer.serialize

It does not saves nor loads the parameters of the target link. They should be separately saved or loaded.

とも書いてあります。今のソースだと、Optimizerはモデルに結びついてないですよね。


なので、

python

1# optimizerの読み込み(存在する場合) 2optimizerFileName = "kakezan-optimizer.npz" 3optimizer = optimizers.SMORMS3() 4optimizer.setup(model) 5if os.path.exists(optimizerFileName): 6 serializers.load_npz(optimizerFileName, optimizer)

ではないでしょうか。試していませんが。

投稿2017/11/15 00:23

quickquip

総合スコア11038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LaLaLand

2017/11/16 03:40

ありがとうございます。これでOKでした
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問