アレックスネットワークの重みの更新について
1 次查看(过去 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!