semantic segmentationのloss functionで完全に迷子になったので復習.
回帰用
torch.nn.L1Loss()
loss(x,y)=1nn∑i=1|xi−yi|
これで学習すると重みがsparseになりやすいことが知られている.torch.nn.MSELoss
loss(x,y)=1n∑i|xi−yi|2
分類用
C個のクラスに分類する.
torch.nn.CrossEntropyLoss
NLLとsoftmaxを合成したloss.
minibatch Xとして,その元xはC次元のベクトルで,i成分がクラスi∈{0,...,C−1}に分類されるスコアであるとする.スコアはsoftmaxによって確率に変換される.
classをxが分類されるべきクラス,pclassをxがclassに分類される確率とすると,
loss(x,class)=−logexp(x[class])∑jexp(x[j])=−logpclass=−x[class]+log(∑jexp(x[j]))
pytorchでは,入力は
input: (N,C)のtensor. j行はxj.
target: (N)のtensor, (x1のクラス,...,xNのクラス)torch.nn.NLLLoss
Cross Entropy Lossとほとんど同じ. softmaxを噛ませるか噛ませないか.
loss(x,class)=−x[class]torch.nn.PoissonNLLLoss
略torch.nn.NLLLoss2d
NLLLossの画像版で,inputのピクセルごとにNLLLossを計算する.
input: (N,C,H,W)のtensor. とりあえずmini-batchの次元Nは無視するとして,c∈Cのi,j成分に対応する要素をxci,jとすると,
xci,jがinputの(i,j)ピクセルがクラスcに属するスコアであって,class(ij)をそれが属すべき真のクラスとすると
loss(x,class)=−∑i,jxclass(ij)
targetは(N,H,W)というtensorで,(n,h,w)成分は,
targetn,h,w={1 (n=class(hw))0(otherwise)torch.nn.KLDivLoss
KL-divergenceによるloss. inputは確率分布だから,総和は1になる.
loss(x,target)=1n∑(targeti∗(log(targeti)−xi))torch.nn.BCELoss
, binary cross entropy criterion
loss(o,t)=−1n∑i{t[i]log(o[i])+(1−t[i]log(1−o[i])})
不安定なので,BCEWithLogitsLoss
が提案されている.BCEWithLogitsLoss
loss(o,t)=−1n∑i{t[i]log(sigmoid(o[i]))+(1−t[i])log(1−sigmoid(o[i]))}
auto-encoderに使われるらしい. 0≤t[i]≤1が必ず成立するようにする.
Semantic segmentationでは複雑なloss functionを自分で書いて実装することになる・・・
0 件のコメント:
コメントを投稿