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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/16 03:40