斎藤 康毅:ゼロから始める Deep Learning 3

作成日 : 2020-09-02
最終更新日 :

概要

副題は「フレームワーク編」
https://github.com/oreilly-japan/deep-learning-from-scratch-3

感想

計算グラフ

計算グラフの概念はアルゴリズムの自動微分と応用で知っていたが、 実際に得られたのには感動した。

途中でしくじる

第 3 ステージまで本書のサンプルコードを手で打ち込みながらなんとか動かしていった。 しかし、第4ステージになって、挫折した。ステップ 37 は「テンソルを扱う」ということで、 37.2 では sum 関数を利用した試験をしている。ところが、この sum 関数はステップ 39 で実装することになっている。 それでは、ということでステップ 39 に行くと、sum 関数は broadcast_to 関数を利用することになっていて、 broadcast_to 関数はステップ 40 で実装する。このように先取りが続いていくと、厳しい。 そして、broadcast_to 関数を実装しようとしてステップ 40 にいき、ここでサンプルが動くことを期待していると、 エラーで動かない。どこで動かなくなったかを示すのは恥ずかしいのでここでは伏せる。

結局 github から最終版の dezero をまるごとインストールして steps/step40.py は動くようになったが、 途中でついていけなくなったことは恥ずかしい。

2022 年 10 月下旬に再度サンプルコードを手で打ち込みながら動かしていったが、 やはり step40.py で挫折した。こんなエラーが出てくる。

PS C:\Users\marinkyo\Documents\programo\dl3> python .\steps\step40.py
variable([11 12 13])
Traceback (most recent call last):
  File "C:\Users\marinkyo\Documents\programo\dl3\steps\step40.py", line 27, in <module>
    y.backward()
  File "C:\Users\marinko\Documents\programo\dl3\steps\..\dezero\core.py", line 48, in backward
    gxs = f.backward(*gys) 
  File "C:\Users\marinkyo\Documents\programo\dl3\steps\..\dezero\core.py", line 143, in backward
    gx0 = dezero.functions.sum_to(gx0, self.x0_shape)
AttributeError: module 'dezero' has no attribute 'functions'

どうやらこれは、utils.py に sum_to 関数が実装されていないことが原因なのではないかと思い、 GitHub から該当部分の関数を実装したが、事態は変わらない。仕方なく最終版の dezero を別ディレクトリにインストールして step40.py を実行したらこちらは問題なく動いた。

そこでもとへ戻って、私が手打ちした動かない dezero で次のステップに進むことにした。step41.py と step42.py は動作したが、 step43.py は動作しない。こんなエラーメッセージが出てくる。

PS C:\Users\marinkyo\Documents\programo\dl3> python .\steps\step43.py
Traceback (most recent call last):
  File "C:\Users\marinkyo\Documents\programo\dl3\steps\step43.py", line 35, in <module>
    y_pred = predict(x)
  File "C:\Users\marinkyo\Documents\programo\dl3\steps\step43.py", line 25, in predict
    y = F.linear(x, W1, b1)
AttributeError: module 'dezero.functions' has no attribute 'linear'

linear がない、といっている。確かにそうだ。functions.py で実装した関数は linear ではなく linear_simple だ。step43.py のほうを、 linear の呼び出しから linear_simple に書き換える。同様に sigmoid の呼び出しも sigmoid_simple に書き換える。すると、 こんなエラーメッセージに代わる。

PS C:\Users\marinkyo\Documents\programo\dl3> python .\steps\step43.py
Traceback (most recent call last):
  File "C:\Users\marinkyo\Documents\programo\dl3\steps\step43.py", line 35, in <module>
    y_pred = predict(x)
  File "C:\Users\marinkyo\Documents\programo\dl3\steps\step43.py", line 26, in predict
    y = F.sigmoid_simple(y)
  File "C:\Users\marinkyo\Documents\programo\dl3\steps\..\dezero\functions.py", line 199, in sigmoid_simple
    y = 1 / (1 + exp(-x))
NameError: name 'exp' is not defined

'exp' がないというのは不思議に思えたが、p.330 の本文には、 指数関数として DeZero の exp 関数を使う点に注意すれば、他には特に難しい点はないでしょう。と書いてある。ということで、 functions.py に、次のコードを追加した。

class Exp(Function):
    def forward(self, x):
        y = np.exp(x)
        return y
    
    def backward(self, gy):
        y = self.outputs[0]() # weakref
        gx = gy * y
        return gx

def exp(x):
    return Exp()(x)

するとエラーメッセージは次のようになった。

PS C:\Users\marinkyo\Documents\programo\dl3> python .\steps\step43.py
Traceback (most recent call last):
  File "C:\Users\marinkyo\Documents\programo\dl3\steps\step43.py", line 45, in <module>
    b1.data -= lr * b1.grad.data
ValueError: non-broadcastable output operand with shape (10,) doesn't match the broadcast shape (100,10)

これは困ったが、class Add だけでなく、class Sub, class Mul, class Div に対してブロードキャスト対応のコード修正を行ったところ、 エラーメッセージなく、結果が得られるようになった。

step45.py では次のエラーが出る。

PS C:\Users\marinkyo\Documents\programo\dl3> python .\steps\step45.py
Traceback (most recent call last):
  File "C:\Users\marinkyo\Documents\programo\dl3\steps\step45.py", line 8, in <module>
    from dezero import Variable, Model
  File "C:\Users\marinkyo\Documents\programo\dl3\steps\..\dezero\__init__.py", line 24, in <module>
    from dezero.models import Model
  File "C:\Users\marinkyo\Documents\programo\dl3\steps\..\dezero\models.py", line 3, in <module>
    from dezero import Layer
ImportError: cannot import name 'Layer' from partially initialized module 'dezero' (most likely due to a circular import) 
     (C:\Users\marinkyo\Documents\programo\dl3\steps\..\dezero\__init__.py)

このエラーを解消する方法がわからない。したがって、step46.py 以降のプログラムは実行できない。

結局、GitHub から最終のプログラムを持ってきて、step52 の GPU 対応のプログラムを実行した。 本書では、Google Colaboratory の GPU を使って 1 エポック 1.5 秒程度で計算できるとの結果を得ている。 私はというと、やっとの思いで GPU つきのデスクトップを買ったのに、本書のプログラムでは、1 エポック 4.2 秒強ほどにしかなっていない。 がっくり。

誤植

ゼロから作る Deep Learning ❸』の正誤表(github.com) にない誤りを見つけた。

p.163 下から4 行目、python steps23.py のように、とあるが、 python step23.py のように、が正しい (コード例が steps/step23.py だから)。

p.271 steps/step37.py のコード2行目、 c = variable(np.array([[10, 20, 30,], [40, 50, 60]])) となっているが、 正しくは c = Variable(...) である(vは小文字ではなく大文字)。

書誌情報

書 名ゼロから始める Deep Learning 3
著 者斎藤 康毅
発行日2020 年 4 月 16 日(初版第1刷)
発行所オライリー・ジャパン
発売元オーム社
定 価4000 円
サイズA5 判
ISBN978-4-87311-906-9
その他越谷市立図書館南部図書室で借りて読む

まりんきょ学問所コンピュータの部屋コンピュータの本ニューロコンピューティング・人工知能 > 斎藤 康毅:ゼロから始める Deep Learning 3


MARUYAMA Satosi