アレックスネットワークの重みの更新について
3 views (last 30 days)
Show older comments
アレックスネットワークのパラメータの更新の仕方について質問です。
添付させていただいた画像のようにアレックスネットワークを利用しました。データセット全150枚のうち、105枚(70%)を学習用に、
45枚(30%)を検証用データとして、ミニバッチサイズを10枚、エポック数を10としています。したがって、画像のように1エポックあたりの反復回数は105/10→10回となっています。
ここで分からないこととしては、ミニバッチあたりの重みの更新の仕方についてです。
私の認識としては、
まず学習用データ1枚分について、逆伝播によって何回かの重みの更新を行う→次の2枚目に重みを引き継ぎ、何回か更新を行う→バッチサイズ10枚分で同じ事を行い、最終的にミニバッチ1単位での重みを決定する。→次のミニバッチに重みを引き継ぐ→・・・
というものなのですが、合っていますでしょうか。また、もし合っている場合、下線部の回数がいくつなのかを知ることは可能でしょうか。
説明がわかりにくく申し訳ないですが、よろしくお願いいたします。
0 Comments
Accepted Answer
Kenta
on 25 Jan 2022
こんにちは、以下私の理解で恐縮なのですが、
10枚分(ミニバッチの数)のデータで推論=>10枚分のクロスエントロピー誤差を計算(損失の計算)=>逆誤差伝搬にてネットワーク全体の重みを更新(回数でいうと1回、というのがよいでしょうか)
という感じではないですかね。
スクリーンショットを見る限り、trainの関数で学習させてると思うのですが、
カスタムループで書く版のドキュメントを見ると参考になるかもしれません。
例えば、以下の関数で入力Xと正解Yがあったときにforwardさせて、さらにそこからロスを計算させて、勾配を求めているのがわかると思います。
質問者さまのおっしゃるように、1枚ずつ勾配を出して更新するのではなくて、10枚の結果をもって更新させています。
10枚だと10枚分の結果が平滑化されるのですが、1枚だとノイジーになって、学習曲線が非常にガタガタした感じになると思います。
function [gradients,state,loss] = modelGradients(dlnet,dlX,Y)
[dlYPred,state] = forward(dlnet,dlX);
loss = crossentropy(dlYPred,Y);
gradients = dlgradient(loss,dlnet.Learnables);
loss = double(gather(extractdata(loss)));
end
https://jp.mathworks.com/help/deeplearning/ug/train-network-using-custom-training-loop.html
2 Comments
More Answers (0)
See Also
Categories
Find more on イメージを使用した深層学習 in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!