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

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

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

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

Python 3.x

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

Q&A

解決済

5回答

615閲覧

AttributeErrorについて質問です。

begonia3003

総合スコア7

Chainer

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

Python 3.x

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

0グッド

0クリップ

投稿2018/04/27 16:34

編集2018/04/28 06:40

前提・実現したいこと

ディープラーニングについて勉強したいと思い公開されていたプログラム(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
というものが出ているのですがこれは無視していていいのでしょうか?

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

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

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

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

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

guest

回答5

0

手元の環境で質問文のコードを実行してみましたが、以下のRuntimeWarningが出ますが、質問文のエラーは発生しませんでした。

C:\Users(ユーザー名)\anaconda\envs\chainer-env\lib\site-packages\chainer\optimizers\adam.py:111: RuntimeWarning: invalid value encountered in sqrt param.data -= hp.eta * (self.lr * m / (numpy.sqrt(vhat) + hp.eps) +

◇実行環境

py:3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:32:41) [MSC v.1900 64 bit (AMD64)] chainer:4.0.0 OS:Windows 10

Python

1import sys 2print(f'py:{sys.version}\nchainer:{chainer.__version__}')

投稿2018/04/27 20:06

編集2018/04/27 20:08
umyu

総合スコア5846

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

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

0

自己解決

みなさんありがとうございました。Pythonを始めたばかりでinitの前後の_が2つずつ必要なことを知識として知らず、また手打ちだったため気づいておらず初期化メソッドのところのinitの前後の_の数が全て1つずつ足りていなかったようです。お騒がせしました。

投稿2018/04/28 06:55

編集2018/04/28 06:59
begonia3003

総合スコア7

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

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

umyu

2018/04/28 13:39

キーワードがハイライト表示されるエディタ(Visual Studio Codeやpycharm community edition)を導入するとそういうミスが発生しずらくなりますー。ご参考まで。
guest

0

Chainer v2を使っているのかもしれません。書き方が変わってるらしいので。

参考:
Chainer v1からChainer v2への移行 - Qiita

こっちで書いてみるとどうでしょうか。

python

1def __init__(self, n_mid_units=100, n_out=10): 2 super(DNN, self).__init__() 3 4 with self.init_scope(): 5 self.l1 = L.Linear(784, 100) 6 self.l2 = L.Linear(100, 100) 7 self.l3 = L.Linear(100, 10)

投稿2018/04/27 17:26

編集2018/04/28 04:12
hayataka2049

総合スコア30933

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

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

umyu

2018/04/27 19:49 編集

DNN#forward関数でl1~l3を使っているので、self.l1~self.l3と定義する必要があるかと。
hayataka2049

2018/04/28 04:11

あ、ほんとうだ。寝ぼけてました
umyu

2018/04/28 04:13

つ 眠気覚ましに綾鷹
guest

0

そのコードを実行すると何かワーニングが出ませんか?でなければChainerのバージョンが低い気がします。ワーニングが出るようであれば、新しい作法でやってみると良いかもしれないです。

https://github.com/chainer/chainer/blob/master/chainer/link.py#L758

投稿2018/04/27 17:24

YouheiSakurai

総合スコア6142

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

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

0

定義のところでself.をl1とかの前につけてもダメですか?
正確には代入ですが。

macOS: 10.13.4
Python 3.6.0 :: Continuum Analytics, Inc.
Chainer: 2.0.0, 4.0.0

元のコードも、hayataka2049さんのwith self.init_scope()のコード(self.l1などに変更したもの)もエラーも警告もなしに正常に実行できました。

jupyter notebookを使っていたりしますか?

投稿2018/04/27 16:46

編集2018/04/28 00:29
mkgrei

総合スコア8560

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

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

begonia3003

2018/04/27 17:12

self.を付けてもkeyword can‘t be an expressionと出てダメでした
begonia3003

2018/04/28 06:18 編集

Anaconda Promptで実行しています
begonia3003

2018/04/28 06:16

jupyter notebookは使ってないです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問