softmax_loss的歸一化問題
cnn網絡中,網絡更新一次參數是根據loss反向傳播來,這個loss是一個batch_size的圖像前向傳播得到的loss和除以batch_size大小得到的平均loss。
softmax_loss前向傳播中有這樣一段代碼: loss/get_normalizer(normalization_,valid_count),這就是對loss進行歸一化。
如果我有ignore_label,valid_cout就不為-1,沒有就為-1。我的prototxt裏面是沒有的,所以最後我使用的normalizer是outer_num_ * inner_num_的形式。
實際上就是如果有ignore_label就歸一化的所有的valid的,如果沒有就是歸一化batch×w×h
get_normalizer的定義在hpp中,實現在cpp文件中。
normalization_mode傳入的是normalization_,normalization_的定義在hpp,賦值實現在cpp的layer_setup裏,如下圖。觀察我的softmax_loss沒有添加loss_param,所以就是默認的valid模式。
normalization_的賦值來自於layer的loss參數,如下圖所示。這裏有normalization和normalize兩個參數,默認的normalization是valid類型,normalize是bool型無默認值。從上面一個圖和下一個圖的解釋可以看出,沒有normalization的情況,normalize為true就是valid,為false就是batch_size,其他情況都是由normalization來決定。也就是說normalize既可以不存在,也可以存在為true,存在為false。
註意結合.h、.cpp、.cu一起看代碼
softmax_loss的歸一化問題