Djangoroidの奮闘記スマートフォン用の表示で見るDjangoroidの奮闘記python,django,angularJS1~三十路過ぎたプログラマーの奮闘記この広告は、90日以上更新していないブログに表示しています。フィン変換」と呼ばれます。レイヤ」という名前で実装していきます。参考書籍より引用ここでは、重み付き信号の総和の計算レイヤ(行列の内積レイヤ)を実装する。変数が行列である点が重要。変数の上の数字は、行列の形状。これまで見てきた計算グラフは、スカラ値がノード間を流れたが、この例では行列がノード間を伝播する。learningではこちらがメインになると思われる。)WTのTは転置を表すらしく、Wの(i,j)の要素を(j,i)に変換するらしい。以下のような感じらしい。行列の計算では、形状がかなり重要になってくる。逆伝播の計算でも、形状を合わせた形で、実装を組み立てる必要がある。バッチ版Affineレイヤ上記のAffineレイヤは、Xが1つのデータだったが、これをバッチ版に変更する。違いは、Xの形が(N,2)になった点だけらしい。それに伴い全体の形状も変更する。注意すべき点は、バイアスの加算。バイアスは、それぞれのデータに対して加算が行われるため、逆伝播の時には、axisを0番目として、総和を求める。self.W.T)#重みの形状の転置を行なって、それをdoutでdotする。入力の形状の転置を行なって、それをdoutでdotする。axis=0)#バイアスはaxis=0で微分する。dxうーん、これはむずいwSoftmax-with-Lossレイヤ出力層のソフトマックス関数の実装。ソフトマックス関数は、入力された値を正規化して出力する。手書き文字認識の場合は、Softmaxレイヤの出力は以下の通り。affineでスコアが一番高いラベルを推論するだけなら、softmaxはいらないが、各ラベルの確率を求めるときは、softmaxが必要。そのため、ニューラルネットワークの学習時にはsoftmaxで出力する必要あり。Softmaxレイヤと交差エントロピー誤差を含めて、Softmax-with-Lossというレイヤで実装する。これはやや複雑で、結論的には以下のようになるらしい。ykこれを計算グラフにすると以下のような図になる。exp(ai)の和をSとしている。最終的な出力はy1,y2,y3としてある。Errorの逆伝播のポイント:Lの部分の逆伝播は、1。ノードの逆伝搬では、入力値をひっくり返した値を上流からの微分に乗算して下流に流す。ノードでは、上流から伝わる微分をそのまま流す。-t3/y3)になる。ノードでは、順伝播の値をひっくり返して乗算する。t1/y1のため、以下の通り置き換えられる。ノードのように、順伝搬の時に複数に枝分かれした場合は、それらの逆伝播の値が加算される。加算され、その加算された値に対して、「/」の逆伝播を行う。t3=1と置き換えられる。ノードの逆伝播がよくわかっていないので、もう一度復習が必要。「+」ノードはそのまま流すだけ。「x」ノードはひっくり返して乗算。exp(a1)「exp」ノードは、以下の関係式が成り立つ。exp(x)変わらないのか〜。そのため、枝別れした2つの入力の和にexp(a1)かけた値が逆伝播の値になる。あることから、y1-t1が導かれる。y3-t3という綺麗な値になる。ニューラルネットワークの逆伝播では、この差分である誤差が前レイヤに伝わっていく。これは偶然ではなく、そうなるように交差エントロピー誤差が設定されているらしい。いう“キレイ”な結果になりました。ロピー誤差という関数が設計されたのです。設計」参照)、これも同様の理由によります。う“キレイ”な結果になるのです。>>参考書籍より引用SoftmaxWithLossのレイヤの実装は以下の通り。#交差エントロピー誤差のインスタンス変数を返す。#教師データの数で割り算する。大まかな手順は、以下の通り。2層のニューラルネットワークをTwoLayerNetとして実装する。ニューラルネットワークのレイヤをOrderedDictで保持する。順伝播、逆伝播を実装しやすい。数値微分は、誤差伝播法の正しさを確認するために使う。数値微分は、実装が簡単なため。数値微分と誤差伝播法の結果を確認する作業を勾配確認という。Relu関数で、0以上のものだけを出力する。Affin2までを行う。最終的にfor構文が終わった時には、Affine2.forward(x)の結果になっているはず。argmaxのラベルの数字を抜き出して配列にする。教師データのargmaxのラベルの数字を抜き出して配列にする。tが一致している確率を算出する。#これは数値微分かな。重みと損失関数から数値微分を行い、各要素の勾配を算出する。t)つまり、loss関数を計算して代入するだけなはず。出力層の逆伝播を求める。list(self.layers.values())#layersをリストにする。#各レイヤーの逆伝搬の値を算出する。self.dbが組み込まれているので、backwardを実行すると各変数に代入される。grads勾配確認の実装は以下の通り。検索リンクはてなブログブログをはじめる週刊はてなブログはてなブログProはてなブログをはじめよう!riikkuさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。