未验证 提交 f0712301 编写于 作者: Z Zeng Jinle 提交者: GitHub

add cross_entropy_op doc, test=develop (#1355)

上级 2e4e3b70
...@@ -5,67 +5,35 @@ cross_entropy ...@@ -5,67 +5,35 @@ cross_entropy
.. py:function:: paddle.fluid.layers.cross_entropy(input, label, soft_label=False, ignore_index=-100) .. py:function:: paddle.fluid.layers.cross_entropy(input, label, soft_label=False, ignore_index=-100)
该函数定义了输入和标签之间的cross entropy(交叉熵)层。该函数支持standard cross-entropy computation(标准交叉熵损失计算) 该OP计算输入input和标签label间的交叉熵,可用于计算硬标签或软标签的交叉熵。
以及soft-label cross-entropy computation(软标签交叉熵损失计算)
1. One-hot cross-entropy算法
soft_label = False, Label[i, 0] 指明样本i的类别所具的索引:
.. math::
\\Y[i]=-log(X[i,Label[i]])\\
2. Soft-label cross-entropy算法
soft_label = True, Label[i, j] 表明样本i对应类别j的soft label(软标签):
.. math::
\\Y[i]= \sum_{j}-Label[i,j]*log(X[i,j])\\
**请确保采用此算法时识别为各软标签的概率总和为1**
3. One-hot cross-entropy with vecterized label(使用向量化标签的One-hot)算法
作为 *2* 的特殊情况,当软类标签内部只有一个非零概率元素,且它的值为1,那么 *2* 算法降级为一种仅有one-hot标签的one-hot交叉熵
1. 硬标签交叉熵算法:若soft_label = False, :math:`label[i_1, i_2, ..., i_k]` 表示每个样本的硬标签值:
.. math::
\\output[i_1, i_2, ..., i_k]=-log(input[i_1, i_2, ..., i_k, j]), label[i_1, i_2, ..., i_k] = j, j != ignore\_index\\
2. 软标签交叉熵算法:若soft_label = True, :math:`label[i_1, i_2, ..., i_k, j]` 表明每个样本对应类别j的软标签值:
.. math::
\\output[i_1, i_2, ..., i_k]= -\sum_{j}label[i_1,i_2,...,i_k,j]*log(input[i_1, i_2, ..., i_k,j])\\
参数: 参数:
- **input** (Variable|list) – 一个形为[N x D]的二维tensor,其中N是batch大小,D是类别(class)数目。 这是由之前的operator计算出的概率,绝大多数情况下是由softmax operator得出的结果 - **input** (Variable) – 维度为 :math:`[N_1, N_2, ..., N_k, D]` 的多维Tensor,其中最后一维D是类别数目。数据类型为float32或float64。
- **label** (Variable|list) – 一个二维tensor组成的正确标记的数据集(ground truth)。 当 ``soft_label`` 为False时,label为形为[N x 1]的tensor<int64>。 ``soft_label`` 为True时, label是形为 [N x D]的 tensor<float/double> - **label** (Variable) – 输入input对应的标签值。若soft_label=False,要求label维度为 :math:`[N_1, N_2, ..., N_k]` 或 :math:`[N_1, N_2, ..., N_k, 1]` ,数据类型为int64,且值必须大于等于0且小于D;若soft_label=True,要求label的维度、数据类型与input相同,且每个样本各软标签的总和为1。
- **soft_label** (bool) – 标志位,指明是否需要把给定的标签列表认定为软标签。默认为False。 - **soft_label** (bool) – 指明label是否为软标签。默认为False,表示label为硬标签;若soft_label=True则表示软标签。
- **ignore_index** (int) – 指定一个被无视的目标值,并且这个值不影响输入梯度。仅在 ``soft_label`` 为False时生效。 默认值: kIgnoreIndex - **ignore_index** (int) – 指定一个忽略的标签值,此标签值不参与计算,负值表示无需忽略任何标签值。仅在soft_label=False时有效。 默认值为-100。
返回: 一个形为[N x 1]的二维tensor,承载了交叉熵损失
弹出异常: ``ValueError``
1. 当 ``input`` 的第一维和 ``label`` 的第一维不相等时,弹出异常
2. 当 ``soft_label`` 值为True, 且 ``input`` 的第二维和 ``label`` 的第二维不相等时,弹出异常
3. 当 ``soft_label`` 值为False,且 ``label`` 的第二维不是1时,弹出异常
返回: 表示交叉熵结果的Tensor,数据类型与input相同。若soft_label=False,则返回值维度与label维度相同;若soft_label=True,则返回值维度为 :math:`[N_1, N_2, ..., N_k, 1]` 。
返回类型:Variable
**代码示例** **代码示例**
.. code-block:: python .. code-block:: python
import paddle.fluid as fluid import paddle.fluid as fluid
classdim = 7 class_num = 7
x = fluid.layers.data(name='x', shape=[3, 7], dtype='float32', append_batch_size=False) x = fluid.layers.data(name='x', shape=[3, 10], dtype='float32')
label = fluid.layers.data(name='label', shape=[3, 1], dtype='float32', append_batch_size=False) label = fluid.layers.data(name='label', shape=[1], dtype='int64')
predict = fluid.layers.fc(input=x, size=classdim, act='softmax') predict = fluid.layers.fc(input=x, size=class_num, act='softmax')
cost = fluid.layers.cross_entropy(input=predict, label=label) cost = fluid.layers.cross_entropy(input=predict, label=label)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册