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

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

新規登録して質問してみよう
ただいま回答率
85.35%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

機械学習

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

Python

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

Q&A

解決済

1回答

1019閲覧

ゼロから学ぶDeepLearning 4章のコードについての質問

masmic

総合スコア1

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

機械学習

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

Python

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

0グッド

1クリップ

投稿2020/05/23 17:38

前提・実現したいこと

現在ゼロから学ぶDeepLearningを使用して勉強しています。
その中で、第四章の二層のネットワーク作成で理解できないことがあります。
(過去別の方が質問した際の回答の一部に、さらに質問したいという内容になります。)

二層のネットワークのコード

python

1import sys, os 2sys.path.append(os.pardir) 3from common.functions import * 4from common.gradient import numerical_gradient 5 6class TwoLayerNet: 7 8 def __init__(self, input_size, hidden_size, output_size, weight_init_std = 0.01): 9 """ 10 input_size・・入力層の数 11 hidden_size・・中間層の数 12 output_size・・出力層の数 13 weight_init_std 14 """ 15 16 #重みの初期化 17 self.params = {} 18 self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size) 19 self.params['b1'] = np.zeros(hidden_size) 20 self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size) 21 self.params['b2'] = np.zeros(output_size) 22 23 24 def predict(self, x): 25 """ 26 入力値をもとに予測をする 27 """ 28 29 W1, W2 = self.params['W1'], self.params['W2'] 30 b1, b2 = self.params['b1'], self.params['b2'] 31 32 a1 = np.dot(x, W1) + b1 33 z1 = sigmoid(a1) 34 a2 = np.dot(z1, W2) + b2 35 y = softmax(a2) 36 return y 37 38 39 def loss(self, x, t): 40 """ 41 損失関数・・どれぐらい教師データと値が違うかを求める 返り値が大きいほど合っていない 42 x・・入力データ 43 t・・教師データ 44 """ 45 y = self.predict(x) 46 return cross_entropy_error(y, t) 47 48 49 def accuracy(self, x, t): 50 """ 51 返り値・・0から1の値 大きいほど入力データからの予測値と、教師データの値が一致している 52 """ 53 y = self.predict(x) 54 y = np.argmax(y, axis=1) 55 t = np.argmax(t, axis=1) 56 57 accuracy = np.sum(y == t) / float(x.shape[0]) 58 return accuracy 59 60 61 def numerical_gradient(self, x, t): 62 """ 63 重みパラメータに対する勾配を求める 64 x・・入力データ 65 t・・教師データ 66 grads・・勾配を保持するディクショナリ変数 67 """ 68 loss_W = lambda W: self.loss(x, t) #loss_Wはloss関数と等しい 69 grads = {} 70 grads['W1'] = numerical_gradient(loss_W, self.params['W1']) 71 grads['b1'] = numerical_gradient(loss_W, self.params['b1']) 72 grads['W2'] = numerical_gradient(loss_W, self.params['W2']) 73 grads['b2'] = numerical_gradient(loss_W, self.params['b2']) 74 return grads

上記の二層ネットワーククラス内で使用しているnumerical_gradientのコード(本に付属しているコード)

python

1def numerical_gradient(f, x): 2 h = 1e-4 # 0.0001 3 grad = np.zeros_like(x) 4 5 it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite']) 6 while not it.finished: 7 idx = it.multi_index 8 tmp_val = x[idx] 9 x[idx] = float(tmp_val) + h 10 fxh1 = f(x) # f(x+h) 11 12 x[idx] = tmp_val - h 13 fxh2 = f(x) # f(x-h) 14 grad[idx] = (fxh1 - fxh2) / (2*h) 15 16 x[idx] = tmp_val # 値を元に戻す 17 it.iternext() 18 19 return grad

理解できない点

以前、別の方からの
「TwoLayerNetクラスのnumerical_gradient関数内で使用されているnumerical_gradient関数は,selfがついていないため、クラスの外側にあるcommon.numerical_gradient関数を使用しているという認識で正しいでしょうか?」
という質問に対し、回答者の方が
「はいそうです。プログラムの先頭部分にfrom common.gradient import numerical_gradient とあるのでcommon以下のgradient.pyに定義されているnumerical_gradientを使用しています。」
と回答されています。

そうすると引数の異なる同名の関数が存在するように思うのですが、一方でpythonはオーバーロードできないという説明を聞きました。
そうすると、上記の「TwoLayerNetクラスのnumerical_gradient関数」と「gradient.pyに定義されているnumerical_gradient関数」はどのような関係のものと思えばいいのでしょうか。

補足情報

以前、別の方がされている質問
https://teratail.com/questions/108865

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

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

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

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

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

guest

回答1

0

ベストアンサー

引数の異なる同名の関数も存在できます。スコープ(どこに所属するか)が異なれば名前が同じでも全く別物になりますので、「TwoLayerNetクラスのnumerical_gradient関数」と「gradient.pyに定義されているnumerical_gradient関数」も全く別物です。

以下、3種類の「test」がありますが、どれもたまたま同名なだけで全くの別物です。

python

1class ClassA: 2 def test(self, a, b, c): 3 print(f'ClassAのtestです: {a}, {b}, {c}') 4 5class ClassB: 6 def test(self, a, b): 7 print(f'ClassBのtestです: {a}, {b}') 8 9def test(a): 10 print(f'testです: {a}') 11 12 13# 3種類の test() を実行 14a = ClassA() 15a.test('abc', 'def', 'ghi') 16 17b = ClassB() 18b.test('あいう', 'かきく') 19 20test('12345')

実行結果:

text

1ClassAのtestです: abc, def, ghi 2ClassBのtestです: あいう, かきく 3testです: 12345

詳細については、「python スコープ」などでググると解説が見つかると思います。

投稿2020/05/24 01:13

segavvy

総合スコア1038

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

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

masmic

2020/06/03 14:08

遅くなりすいません。ありがとうございました。 全くの別物ということで理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問