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

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

新規登録して質問してみよう
ただいま回答率
85.50%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

2028閲覧

要素の呼び出しについて (ゼロから作るDeeplearning)

achala

総合スコア27

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/05/30 06:23

###前提・実現したいこと
現在, オライリー・ジャパンの”ゼロから作るDeep Learning”を使って機械学習を勉強しています。
3.4.3の”実装のまとめ”を今やっています。

テキストに載っていたとおりの, 下記のコードを実行すると(文字・数値は多少変えています)下にあるようなエラーが出るのですが, これはコード自体が間違っているのでしょうか?
また, どうしてエラーになってしまうのか教えていただけるとうれしいです。

###該当のソースコード

python

1def initialnetwork(): 2 network = {} 3 network['W1'] = np.array([[0.3, 0.8, 0.6], [0.5, 0.9, 0.1]]) 4 network['W2'] = np.array([[0.7, 0.2], [0.4, 0.8], [0.3, 0.5]]) 5 network['W3'] = np.array([[0.7, 0.5], [0.3, 0.9]]) 6 network['B1'] = np.array([0.1, 0.2, 0.3]) 7 network['B2'] = np.array([0.1, 0.2]) 8 network['B3'] = np.array([0.1, 0.2]) 9 10 return network 11 12def forward(network, x): 13 W1, W2, W3 = initialnetwork['W1'], initialnetwork['W2'], initialnetwork['W3'] 14 B1, B2, B3 = initialnetwork['B1'], initialnetwork['B3'], initialnetwork['B3'] 15 16 a = np.dot(X, W1) + B1 17 A = sigmoid(a) 18 b = np.dot(A, W2) + B2 19 B = sigmoid(b) 20 y = np.dot(B, W3) + B3 21 Y = identityfunction(y) 22 return Y 23 24 25network = initialnetwork 26X = np.array ([0.3, 0.4]) 27Y = forward(network, X) 28print (Y)

###発生している問題・エラーメッセージ

Traceback (most recent call last): File "C:〇〇", line 13, in <module> W1, W2, W3 = initialnetwork['W1'], initialnetwork['W2'], initialnetwork['W3'] TypeError: 'function' object is not subscriptable

###補足
initialnetworkを関数化せず, ただの辞書型として定義して実行するのは試してみました。
その場合はきちんと実行されました。

initialnetwork = {} initialnetwork['W1'] = np.array([[0.3, 0.8, 0.6], [0.5, 0.9, 0.1]]) initialnetwork['W2'] = np.array([[0.7, 0.2], [0.4, 0.8], [0.3, 0.5]]) initialnetwork['W3'] = np.array([[0.7, 0.5], [0.3, 0.9]]) initialnetwork['B1'] = np.array([0.1, 0.2, 0.3]) initialnetwork['B2'] = np.array([0.1, 0.2]) initialnetwork['B3'] = np.array([0.1, 0.2]) def forward(initialnetwork,X): W1, W2, W3 = initialnetwork['W1'], initialnetwork['W2'], initialnetwork['W3'] B1, B2, B3 = initialnetwork['B1'], initialnetwork['B3'], initialnetwork['B3'] a = np.dot(X, W1) + B1 A = sigmoid(a) b = np.dot(A, W2) + B2 B = sigmoid(b) y = np.dot(B, W3) + B3 Y = identityfunction(y) return Y X = np.array ([0.3, 0.4]) Y = forward(initialnetwork, X) print (Y)

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

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

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

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

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

guest

回答3

0

ベストアンサー

2か所問題があります。修正しましょう。

# 略 def forward(network, x): # initialnetworkではなく引数のnetwork変数(辞書)から値を取得する #W1, W2, W3 = initialnetwork['W1'], initialnetwork['W2'], initialnetwork['W3'] W1, W2, W3 = network['W1'], network['W2'], network['W3'] # 略。他も同様。 # initialnetwork関数を呼び出すように。 #network = initialnetwork network = initialnetwork() # 略

投稿2017/05/30 08:22

can110

総合スコア38233

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

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

achala

2017/05/31 01:49

initialnetwork関数の()は完全に盲点でした。エラーとして直接出るところでもないので, 要注意ですね…。 ご回答ありがとうございました。
guest

0

forwardの中でちゃんと辞書を作るべきです。
これだと関数が呼ばれるたびに辞書を作ってしまうので無駄になります。

def forward(initialnetwork,X): dict = initialnetwork(): W1, W2, W3 = dict['W1'], dict['W2'], dict['W3'] B1, B2, B3 = dict['B1'], dict['B3'], dict['B3'] a = np.dot(X, W1) + B1 A = sigmoid(a) b = np.dot(A, W2) + B2 B = sigmoid(b) y = np.dot(B, W3) + B3 Y = identityfunction(y) return Y

投稿2017/05/30 07:18

_Victorique__

総合スコア1392

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

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

_Victorique__

2017/05/30 07:41

ちなみにエラーの原因は initialnetwork()[key] このように()が抜けていてちゃんと関数として書かれていないからです。
achala

2017/05/31 01:57

関数が呼ばれるたびに辞書を作ってしまう, ということはどういうことなのでしょうか? より無駄なく早く動かすのにしたほうが良い改善なのだろうということは推測できるのですが, 具体的に何が変わるのかいまいちつかめていないので, 教えていただけるとうれしいです。
_Victorique__

2017/05/31 02:03

W1, W2, W3 = initialnetwork()['W1'], initialnetwork()['W2'], initialnetwork()['W3'] この部分で3回関数が呼ばれているのは分かりますか? initialnetwork()['key']のたびにいちいち辞書を作成してからkey検索をしている事になり、効率的ではありません。あらかじめ辞書オブジェクトを生成してしまえば1回辞書を作成するだけで済みます。
achala

2017/05/31 02:39

すっきりしました! ご回答, アドバイスありがとうございました。
guest

0

python

1def forward(network, x): 2 W1, W2, W3 = initialnetwork['W1'], initialnetwork['W2'], initialnetwork['W3'] 3 B1, B2, B3 = initialnetwork['B1'], initialnetwork['B3'], initialnetwork['B3'] 4...

引数はinitialnetworkじゃなくてnetworkですね。

python

1def forward(network, x): 2 W1, W2, W3 = network['W1'], network['W2'], network['W3'] 3 B1, B2, B3 = network['B1'], network['B3'], network['B3']

投稿2017/05/30 07:25

ozwk

総合スコア13512

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

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

achala

2017/05/31 01:48

いじったときに直し忘れてしまっていたようです。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問