在分类问题中,比如我们训练一个网络,让它识别出这张照片是否为人,我们的数据集假设有张1000张,其中100张为人,900张不是人(里面包含了车,飞机,花朵等乱七八糟的图片),可以看到这个数据集出现了负样本远大于正样本的情况.现在假设我们把这1000张图片一次性送入网络进行训练,那么得到的损失值如何计算?负样本对损失值有贡献吗?
答案:
(1)损失值loss计算公式:
假设真实标签值y_true=[y1,y2,y3,...yn]
预测值y_pred=[z1,z2,z3,...zn]
(1)
(2) 负样本对损失值有贡献,主要体现到上面的loss计算上,虽然负样本标签值=0,分子中遇到负样本0,y_i*log(z_i)=0, 但是在分母中,n的值是正负样本样本的总数量,所以负样本对损失值是有贡献的,特别当正负样本比例失衡,负样本远大于正样本时,会造成训练进行不下去.
还是用一段程序来证明吧
import tensorflow as tf
y_true=[[0], [0],[0],[0],[1], [1]]#真实标签
y_pre=[[0.9],[0.9],[0.9],[0.9],[0.6],[0.5]]#预测值
cross_entropy=-tf.reduce_mean(y_true*tf.log(tf.clip_by_value(y_pre,1e-10,1.0)))#-ylogp
a=-tf.log