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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

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

Q&A

解決済

2回答

1035閲覧

ゼロから作るDeep Leaningのクラスのコンストラクタの挙動

MycoChild

総合スコア36

Python 3.x

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

2グッド

5クリップ

投稿2020/05/29 07:30

質問

ゼロから作るDeep Leaningの第五章
5.4.1 乗算レイヤの実装
のclass MulLayerのinit関数で、

class MulLayer: def __init__(self): self.x = None self.y = None

となっている理由は何ですか?

疑問

init関数ではインスタンス変数であるxとyの初期化を行っていると思うのですが、この必要性を感じません。
どうせなら、init関数にx,yを渡して

def __init__(self, x, y): self.x = x self.y = y

のようにすればいいいじゃない?と思います。
ちなみに、AddLayerの方では、init関数はpassだけとなっています。
MulLayerでpassとしても、同じように動きました。
他にもいろいろなクラスのinit関数で

self.hoge = None

なる初期化をしていますが、なぜなのでしょうか?

(p.s.) teratailでの質問は初めてなので、質問の仕方がおかしければご指摘願います。悪しからず。

kentoo_1, DrqYuto👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

落ち穂拾いとして。

p134に

加算ノードの逆伝播は入力信号を次のノードへ出力するだけなので、図5 - 11 のよ うに、1.3 を次のノードへと流します。

p135に

乗算の逆伝播では、順伝播のときの入力信号の値が必要になります。そのため、乗算 ノードの実装時には、順伝播の入力信号を保持します。

と書いてあるはずです。

加算ノードの逆伝播は加算した値を覚えておく必要がない
乗算ノードの逆伝播は乗算した値を覚えておく必要がある

ことが

AddLayerはインスタンス変数を持つ必要がない
MulLayerはインスタンス変数を持つ必要がある

という違いを生んでいます。

性質が違うものを比較して

ちなみに、AddLayerの方では、init関数はpassだけとなっています。

と言っても意味がないです。違うものなのですから。


どうせなら、init関数にx,yを渡して

(略)
のようにすればいいいじゃない?と思います。

は論外です。インスタンス化の時点=順伝播より前に足したり掛けたりする数値が分かってるということは入力が定数だということです。

投稿2020/05/29 08:38

編集2020/05/29 08:42
quickquip

総合スコア11235

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

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

MycoChild

2020/05/29 14:44

ありがとうございました!
guest

0

初期化をしていますが、なぜなのでしょうか?

属性はオブジェクトを作成した段階で定義しておくことが、設計上好ましいからという理由になります。
今回の場合、x, y という属性は MulLayer が持っているべき属性なので、__init__(self) 内で定義します。その時点でいれるべき値がない場合は None で初期化する場合が多いです。
コードの可読性の面でもいろんなメソッド内で属性が定義されているよりも __init__(self) 内でそのクラスがもつ属性がまとめて定義されていたほうがわかりやすいです。


__init__(self) 以外の関数で属性を定義した場合、その関数を呼ぶより前にその属性にアクセスした場合、AttributeError エラーになります。
一方、__init__(self) はオブジェクトを作成した際に必ず呼ばれるので、そこで属性を定義しておけば、オブジェクトを作成した段階でその属性が存在していることになります。

python

1class MyClass: 2 def __init__(self): 3 self.a = None 4 5 def func(): 6 self.b = 1 # ここで初めて属性 b が定義される 7 8inst = MyClass() 9 10# MyClass を作った段階で `a` という属性は定義されている 11print(inst.a) # None 12# func() を呼ぶまで属性 `b` は定義されていないのでエラーになる。 13print(inst.b) 14# AttributeError: 'MyClass' object has no attribute 'a'

投稿2020/05/29 07:59

編集2020/05/29 08:07
tiitoi

総合スコア21956

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問