ゼロから作るDeep Learningでど素人がつまずいたことメモ 4章
4.2.4 [バッチ対応版] 交差エントロピー誤差の実装
まず教師データがone-hot表現の方に少し苦労したのですが、教師データがラベルとして与えられた時は意味不明でした。
そこで、
というサイトを参照しました。
ここで、y[np.arange(batch_size), t]でyから座標(batch_size, t)が抜き出されるということがわかり、式の意味が分かりました。からっぽのしょこさんありがとうございました。
4.3.2 数値微分の例
このセクションの一番最後にあるソースコードch04/gradient_1d.pyの内容がよくわからなかったです。
def tangent_line(f, x):
d = numerical_diff(f, x)
print(d)
y = f(x) - d*x
return lambda t: d*t + y
このlambdaが何をしているのかがよくわかりませんでした。そういうpythonの関数なんですね。lambdaの後に使いたい文字(例えばa, b, c)を指定して、:の後に使いたい関数を入力するという仕組みのようです。
例えば、
>>>add = lambda a, b, c: a + b + c
>>>add(10, 10, 10)
30
となります。
http://biopython.seesaa.net/article/451906424.html
https://towardsdatascience.com/python-lambda-function-b6e1fa3420c1
この二つのサイトはとても参考になりました。ありがとうございます。
4.3.3 偏微分
ここで初めてcodeが示されてない部分が出てきました。
function_2(x)のグラフですね。
これは
を参考にというか丸写ししたら綺麗なグラフが描けました。
#ここら辺で初めて1e-10= 0.0000000001など10の−10乗を表すことを知りました、、、
4.4.1 勾配法
図4−10を描くコードがch04/gradient_method.pyにあるんですが、僕はこのコードのfom gradient_2d import numerical_gradientのところで毎回 No module named 'gradient_2d'というエラーが出てきてしまうので諦めて
このサイトを参照しコードをコピペしました。
そしたら実際綺麗な図が描けました。
4.4.2 ニューラルネットワークに対する勾配
simpleNetというものを構成するときに、なんでこんなにselfという訳の分からないものがたくさん出てくるのだろうと思っていたのですが、classを設定するのに必要だったのだなと思い出しました。一番最初の方の10ページあたりでしています。
そこからもlambdaってなんだったっけとも思ったのですが、これも以前出てきたものでした。
4.5.2 ミニバッチ学習の実装
最初コード通り打っていたはずなんですが、最後のappendコマンドが無いみたいなことを言われて、明日に回してもう一度打ってみると今度は時間がかかりすぎて終わりませんでした。なので、結局高速版の方を使うとできました。後は、グラフが欲しかったので
このサイトに載っていたグラフのcodeを打ち込むと
このようなグラフをゲットしたのですが、意外と右上の細かい数字を見てみると最後らへんは値が0.2付近で止まっているのをみると案外小さくならないんだなと思いました。ただaccuracyの値はまだ見てないので何とも言えません。
4.5.3 テストデータで評価
ここら辺でコードをコピペするという技を覚えてしまいました。
今までは見てそのまま手動で打ち込んでいたのですがコピペは楽ですね。
教科書のようなグラフは出てこず、最初からaccuracyは94くらいでした。
ただし、python train_neuralnet.pyによってpythonに勝手にやらせると
このような綺麗なグラフが出てきました。全く同じものをcodeしているはずなのに違う値が出てくるのは奇妙でした。
感想
思っていたより時間がかかりました。4章で挫折したという声もちらほら聞いていたので自分が終わるかは不安でしたが何とか終わらせることができました。4章だけで1週間かかった計算となります。ただ時間がかかっても終わらせれたので満足しています。
次は5章にチャレンジ!