前提・実現したいこと
ディープラーニングについて勉強したいと思い公開されていたプログラム(MNISTデータの正解数と正解率を出すプログラム)を実際に動かそうとしてみたら以下のエラーが出てきました。
どこが原因かご指摘お願いします。
発生している問題・エラーメッセージ
File “mnist.py”,line65 in<module>
y= model.forward(x)
File “mnist.py”,line40 in forward
h1= F.relu(self.l1)
AttributeError:‘DNN’object has no attribute ‘l1’
該当のソースコード
Python
1 2# Numpy 3import numpy as np 4# Chainer 5import chainer 6import chainer.links as L 7import chainer.functions as F 8from chainer import Chain, optimizers, Variable 9 10train, test = chainer.datasets.get_mnist() 11 12x_train = [] 13x_test = [] 14t_train = [] 15t_test = [] 16 17for line in train: 18 x_train.append(line[0]) 19 t_train.append(int(line[-1])) 20 21for line in test: 22 x_test.append(line[0]) 23 t_test.append(int(line[-1])) 24 25x_train = np.array(x_train, dtype=np.float32) 26x_test = np.array(x_test, dtype=np.float32) 27t_train = np.array(t_train, dtype=np.int32) 28t_test = np.array(t_test, dtype=np.int32) 29 30# DNNのクラス 31class DNN(Chain): 32 def __init__(self): 33 super(DNN, self).__init__( 34 l1 = L.Linear(784, 100), 35 l2 = L.Linear(100, 100), 36 l3 = L.Linear(100, 10) 37 ) 38 def forward(self, x): 39 h1 = F.relu(self.l1(x)) 40 h2 = F.relu(self.l2(h1)) 41 h3 = self.l3(h2) 42 return h3 43 44# DNNクラスのインスタンス 45model = DNN() 46 47# 最適化手法 48optimizer = optimizers.Adam() 49optimizer.setup(model) 50 51# エポック数 52n_epoch = 10 53 54# バッチサイズ 55batch_size = 1000 56 57# 学習実行 58for epoch in range(n_epoch): 59 sum_loss = 0 60 perm = np.random.permutation(60000) 61 for i in range(0, 60000, batch_size): 62 x = Variable(x_train[perm[i:i+batch_size]]) 63 t = Variable(t_train[perm[i:i+batch_size]]) 64 y = model.forward(x) 65 model.cleargrads() 66 loss = F.softmax_cross_entropy(y, t) 67 loss.backward() 68 optimizer.update() 69 sum_loss += loss.data*batch_size 70 71 print("epoch: {}, mean loss: {}".format(epoch, sum_loss/60000)) 72 73# テスト実行 74cnt = 0 75for i in range(10000): 76 x = Variable(np.array([x_test[i]], dtype=np.float32)) 77 t = t_test[i] 78 y = model.forward(x) 79 y = np.argmax(y.data[0]) 80 if t == y: 81 cnt += 1 82 83# 正解数と正解率を表示 84print(cnt) 85print("accuracy: {}".format(cnt/(10000))) 86 87
試したこと
インターネットや本でクラスのアトリビュートについて調べて考えてみたがどこが悪いのかわからずに断念
調べた結果、DNNにl1アトリビュートがないというエラーの意味だとわかったのですが、DNNクラスの初期化メソッドでスーパークラスのinitメソッドを呼び出してここでl1、l2、l3を生成しているのでこのままで大丈夫ではないのか?と思ったのですがもし私が勘違いしている箇所があればそれについてのご指摘もできればお願いします。
補足情報(FW/ツールのバージョンなど)
Python3.6.4
chainer3.0.0(おそらく)
記載をし忘れてしまってましたがプログラムの実行直後にfuturewarning:conversion of the second argument of issubdtype from ‘float’ to ‘np.floating’ is deprecated.In future it will be treated as ‘np.float64 == np.dtype(float).type’.
from ._cov import register_converters as _register_converters
というものが出ているのですがこれは無視していていいのでしょうか?
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。