アレックスネットワークの重みの更新について
조회 수: 2 (최근 30일)
이전 댓글 표시
アレックスネットワークのパラメータの更新の仕方について質問です。
添付させていただいた画像のようにアレックスネットワークを利用しました。データセット全150枚のうち、105枚(70%)を学習用に、
45枚(30%)を検証用データとして、ミニバッチサイズを10枚、エポック数を10としています。したがって、画像のように1エポックあたりの反復回数は105/10→10回となっています。
ここで分からないこととしては、ミニバッチあたりの重みの更新の仕方についてです。
私の認識としては、
まず学習用データ1枚分について、逆伝播によって何回かの重みの更新を行う→次の2枚目に重みを引き継ぎ、何回か更新を行う→バッチサイズ10枚分で同じ事を行い、最終的にミニバッチ1単位での重みを決定する。→次のミニバッチに重みを引き継ぐ→・・・
というものなのですが、合っていますでしょうか。また、もし合っている場合、下線部の回数がいくつなのかを知ることは可能でしょうか。
説明がわかりにくく申し訳ないですが、よろしくお願いいたします。
댓글 수: 0
채택된 답변
Kenta
2022년 1월 25일
こんにちは、以下私の理解で恐縮なのですが、
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
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 イメージを使用した深層学習에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!