CNN调参:利用损失函数权重处理不平衡数据集(二)

深度神经网络的性能很大程度上依赖于数据,大多数的数据集是不平衡的。比如自动驾驶的图像语义分割:车道、人行道占了绝大多数的像素,交通灯、行人等占的像素少。神经网络“看到”的道路数据更多,所以倾向于把很多交通灯也识别成道路。为了更准确地识别到这些小物体,可以设置损失函数的权重,为少的数据设置更大的权重,让神经网络不敢认错这些小物体。

caffe下的操作示例:

layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "Output_conv"
  bottom: "label"
  top: "loss"
  loss_param {
    ignore_label: 255
    weight_by_label_freqs: true
    class_weighting: 2.3653597831726    
    class_weighting: 4.4237880706787    
    class_weighting: 2.9691488742828    
    class_weighting: 5.3442072868347    
  }
}

通过class_weighting依次设置不同类别的权重。 但是权重的设置很有讲究,并非给小的物体设置权重越大越好,否则神经网络会把(低权重的)大物体也识别成(高权重的)小物体。比如给交通灯过高的权重,让神经网络把路也识别成了交通灯。如果设置class_weighting从零训练,等训练好后发现权重设置不合理导致训练结果不满意,又要重新设置权重,训练成本高。

可以通过如下训练技巧调整:

  1. 首先不加权重,让神经网络可以比较准确地识别主要物体。
  2. 再设置几组不同的class_weighting进行finetune,比较选取能够获得最好结果的权重。

这种调整方法物理意义明确!

你可能感兴趣的:(深度学习)