建议Fluid的softmax_with_cross_entropy支持输入大于2-D的场景
Created by: zenghsh3
目前Fluid的softmax_with_cross_entropy只支持2-D的logits和label输入,但输入大于2-D的场景也是有的,建议直接支持任意大于2-D的输入。
类似于下面功能:
def softmax_with_cross_entropy_any_rank(logits, label, soft_label=False, ignore_index=-100):
""" Expend paddle.fluid.layers.softmax_with_cross_entropy to support any rank input.
Will do the softmax and cross entropy along the last dim of logits and label.
Args:
logits (Variable): The unscaled log probabilities, which is a (N + 1)-D tensor with shape
[d1 x d2 x ... dN x K]. K is the class number.
label (Variable): The ground truth which is a (N + 1)-D tensor. If soft_label is set to false,
Label is a Tensor<int64> with shape [d1 x d2 x ... dN x 1].
If soft_label is set to true, Label is a Tensor<float/double> with shape
[d1 x d2 x ... dN x K].
soft_label (bool): A flag to indicate whether to interpretate the given labels as soft
labels. By default, soft_label is set to False.
ignore_index (int): Specifies a target value that is ignored and does not contribute to the
input gradient. Only valid if soft_label is set to False. Default: -100
Returns:
The cross entropy loss is a (N + 1)-D tensor with shape [d1 x d2 x ... dN x 1].
"""
if len(logits.shape) > 2:
result_shape = list(logits.shape[:-1]) + [1]
flatten_logits = layers.reshape(logits, shape=[-1, logits.shape[-1]])
flatten_label = layers.reshape(label, shape=[-1, label.shape[-1]])
flatten_result = layers.softmax_with_cross_entropy(flatten_logits, flatten_label, soft_label, ignore_index)
result = layers.reshape(flatten_result, shape=result_shape)
return result
else:
return layers.softmax_with_cross_entropy(logits, label, soft_label, ignore_index)