tensorflow中的损失函数介绍
本文参考借鉴了:损失函数loss大大总结,地址:https://blog.youkuaiyun.com/qq_14845119/article/details/80787753
并参考官方文档整理而成。
一. 分类损失函数
1.二分类交叉熵损失sigmoid_cross_entropy:
Aliases:
tf.losses.sigmoid_cross_entropy(…):
使用tf.nn.sigmoid_cross_entropy_with_logits创建交叉熵loss.
tf.losses.sigmoid_cross_entropy(
multi_class_labels,
logits,
weights=1.0,
label_smoothing=0,
scope=None,
loss_collection=tf.GraphKeys.LOSSES,
reduction=Reduction.SUM_BY_NONZERO_WEIGHTS
)
参数介绍:
1.multi_class_labels: [batch_size, num_classes] 目标整数标签位于{0,1}。
2.logits: Float [batch_size, num_classes] 网络的logits输出。
返回值:
与logits类型相同的加权损失张量。如果reduction为NONE,则它的形状与logits相同;否则,它是标量。
tf.nn.sigmoid_cross_entropy_with_logits
tf.nn.sigmoid_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
name=None
)
参数介绍:
logits and labels must have the same type and shape.
labels: [batch_size, num_classes]。目标整数标签位于{0,1}。
logits: Float [batch_size, num_classes] 。
name: A name for the operation (optional).
返回值:A Tensor of the same shape as logits with the componentwise logistic losses.[batch_size, num_classes]
tf.keras.losses.binary_crossentropy
可以使网络最后一层的激活函数为sigmoid/tanh, 再将loss设置为此objective。
y_true与y_pred形状相同,都为[batch_size,1]
tf.keras.losses.binary_crossentropy(
y_true,
y_pred,
from_logits=False,
label_smoothing=0
)
2.多分类交叉熵损失softmax_cross_entropy:
Aliases:
tf.losses.softmax_cross_entropy(…):
使用tf.nn.softmax_cross_entropy_with_logits创建交叉熵loss.
tf.losses.softmax_cross_entropy(
onehot_labels,
logits,
weights=1.0,
label_smoothing=0,
scope=None,
loss_collection=tf.GraphKeys.LOSSES,
reduction=Reduction.SUM_BY_NONZERO_WEIGHTS
)
参数介绍:
onehot_labels: One-hot-encoded labels.
logits: Logits outputs of the network.
返回值:
与logits类型相同的加权损失张量。如果reduction为NONE,则它的形状与logits相同;否则,它是标量。
tf.losses.sparse_softmax_cross_entropy(…):
使用tf.nn.sparse_softmax_cross_entropy_with_logits创建交叉熵loss.
tf.losses.sparse_softmax_cross_entropy(
labels,
logits,
weights=1.0,
scope=None,
loss_collection=tf.GraphKeys.LOSSES,
reduction=Reduction.SUM_BY_NONZERO_WEIGHTS
)
参数介绍:
labels: [batch_size,] .And dtype int32 or int64. Each entry in labels must be an index in [0, num_classes).(非独热码)
logits: [batch_size, num_classes]. And dtype float16, float32 or float64.
返回值:与logits类型相同的加权损失张量。如果reduction为NONE,则它与labels具有相同的形状;否则,它是标量。
tf.nn.softmax_cross_entropy_with_logits
同时tf.nn.sparse_softmax_cross_entropy_with_logits.具有相同功能,但输入labels维度为[batch_size,]
tf.nn.softmax_cross_entropy_with_logits(
_sentinel=None,
labels=None,
logits=None,
dim=-1,
name=None,
axis=None
)
参数介绍:
labels: [batch_size, num_classes], each row of labels[i] must be a valid probability distribution.
logits: [batch_size, num_classes]。
dim: The class dimension. Defaulted to -1 which is the last dimension.
返回值:与labels具有相同的形状。
tf.keras.losses.categorical_crossentropy
输出单元可以用softmax激活,然后再用此损失函数。
输入参数维数:[batch_size,num_classes]
转成one-hot编码可用:
keras.utils.to_categorical(y, num_classes=None, dtype=‘float32’)
tf.keras.losses.categorical_crossentropy(
y_true,
y_pred,
from_logits=False,
label_smoothing=0
)
tf.keras.losses.sparse_categorical_crossentropy
输出单元可以用softmax激活,然后再用此损失函数。
y_true维数:[batch_size,] 即数字编码,非one-hot编码。
tf.keras.losses.sparse_categorical_crossentropy(
y_true,
y_pred,
from_logits=False,
axis=-1
)
二. 回归损失函数
1.MSE表示了预测值与目标值之间差值的平方和然后求平均。
L2损失表示了预测值与目标值之间差值的平方和然后开更方,L2表示的是欧几里得距离。
MSE和L2的曲线走势都一样。区别在于一个是求的平均np.mean(),一个是求的更方np.sqrt()
tf.losses.mean_squared_error(
labels,
predictions,
weights=1.0,
scope=None,
loss_collection=tf.GraphKeys.LOSSES,
reduction=Reduction.SUM_BY_NONZERO_WEIGHTS
)
tf.metrics.mean_squared_error(
labels,
predictions,
weights=None,
metrics_collections=None,
updates_collections=None,
name=None
参数介绍:
labels: The ground truth output tensor, same dimensions as ‘predictions’.
predictions: The predicted outputs.
metrics版本的返回值有两个:update_op,mean_squared_error,一般损失值在[1]。
Keras接口:mean_squared_error 或 mse
2.MAE表示了预测值与目标值之间差值的绝对值然后求平均
L1表示了预测值与目标值之间差值的绝对值,L1也叫做曼哈顿距离。
MAE和L1的区别在于一个求了均值np.mean(),一个没有求np.sum()。2者的曲线走势也是完全一致的。
tf.metrics.mean_absolute_error(
labels,
predictions,
weights=None,
metrics_collections=None,
updates_collections=None,
name=None
)
参数介绍:
labels: A Tensor of the same shape as predictions.
predictions: A Tensor of arbitrary shape.
返回值:update_op,mean_absolute_error
keras接口:mean_absolute_error或mae
3.Huber Loss和smooth L1:
Huber loss具备了MAE和MSE各自的优点,当δ趋向于0时它就退化成了MAE,而当δ趋向于无穷时则退化为了MSE。
Smooth L1 loss也具备了L1 loss和L2 loss各自的优点,本质就是L1和L2的组合。
Huber loss和Smooth L1 loss具有相同的曲线走势,当Huber loss中的δ等于1时,Huber loss等价于Smooth L1 loss。
对于Huber损失来说,δ的选择十分重要,它决定了模型处理局外点的行为。当残差大于δ时使用L1损失,很小时则使用更为合适的L2损失来进行优化。
Huber损失函数克服了MAE和MSE的缺点,不仅可以保持损失函数具有连续的导数,同时可以利用MSE梯度随误差减小的特性来得到更精确的最小值,也对局外点具有更好的鲁棒性。
但Huber损失函数的良好表现得益于精心训练的超参数δ。
tf.losses.huber_loss(
labels,
predictions,
weights=1.0,
delta=1.0,
scope=None,
loss_collection=tf.GraphKeys.LOSSES,
reduction=Reduction.SUM_BY_NONZERO_WEIGHTS
)
参数介绍:
labels: The ground truth output tensor, same dimensions as ‘predictions’.
predictions: The predicted outputs.
返回值:Weighted loss float Tensor. If reduction is NONE, this has the same shape as labels; otherwise, it is scalar.