サンプルコードをよく見ればわかる話なんですが、私は見落としていたので書いておきます。
ステップ32でMulクラスのbackwardメソッドの修正と同様の手順でNeg、Sub、Div、Powクラスbackwardメソッドを修正したはずなのにステップ33でPowクラスでTypeErrorが出る場合の修正方法です。
Powクラスのbackwardメソッドのself.inputsから受け取る変数は一つだけなので次のように書いていないでしょうか?私は書きました。
classPow(Function): ... defbackward(self, gy): x = self.inputs ...
self.inputsはリストですのでこの書き方だとxはリストになってしまいます。そしてエラーメッセージでlistとintでは累乗計算はできないと怒られます。
TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'
本来はself.inputsリストの要素を変数xに代入したいのです。
変数一つだけの場合、リストから取り出し代入するには次のように変数の後にカンマを入力します。
defbackward(self, gy): x, = self.inputs ...
この本の最初のほうで書かれていたような記憶があるのですが、すっかり忘れていました。
サンプルコードには当たり前ですがしっかりカンマがありました。サンプルコードと自分で写経しているコードを見比べてもいたのですが、先入観は恐ろしいですね、カンマに気づきませんでした。
エラーメッセージですぐにピンと来る人には来るのでしょうけど、自分はカンマ一つで小一時間ほど悩みました。ここは「同様の手順でやってください」と書かれ、本の中でコードの記載がない箇所なのでハマる人もいるかなと思い記事にしました。
アイキャッチの画像はGerd AltmannによるPixabayからお借りいたしました。
コメント