首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TensorFlow SparseCategoricalCrossentropy是如何工作的?

TensorFlow SparseCategoricalCrossentropy是如何工作的?
EN

Stack Overflow用户
提问于 2020-01-17 13:00:55
回答 2查看 22.5K关注 0票数 22

我试图在TensorFlow中理解这个损失函数,但我不明白。是SparseCategoricalCrossentropy.所有其他损失函数都需要相同形状的输出和标签,这个特定的丢失函数不需要。

源代码:

代码语言:javascript
复制
import tensorflow as tf;

scce = tf.keras.losses.SparseCategoricalCrossentropy();
Loss = scce(
  tf.constant([ 1,    1,    1,    2   ], tf.float32),
  tf.constant([[1,2],[3,4],[5,6],[7,8]], tf.float32)
);
print("Loss:", Loss.numpy());

错误是:

代码语言:javascript
复制
InvalidArgumentError: Received a label value of 2 which is outside the valid range of [0, 2).  
Label values: 1 1 1 2 [Op:SparseSoftmaxCrossEntropyWithLogits]

如何为损失函数SparseCategoricalCrossentropy提供合适的参数?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-17 13:21:16

SparseCategoricalCrossentropy和CategoricalCrossentropy都计算范畴交叉熵.唯一的区别是目标/标签应该如何编码。

当使用SparseCategoricalCrossentropy时,目标由类别的索引(从0开始)表示。您的输出具有4x2形状,这意味着您有两个类别。因此,目标应该是具有0或1项的4维向量。例如:

代码语言:javascript
复制
scce = tf.keras.losses.SparseCategoricalCrossentropy();
Loss = scce(
  tf.constant([ 0,    0,    0,    1   ], tf.float32),
  tf.constant([[1,2],[3,4],[5,6],[7,8]], tf.float32))

这与CategoricalCrossentropy的不同之处在于标签应该是一个热编码的:

代码语言:javascript
复制
cce = tf.keras.losses.CategoricalCrossentropy();
Loss = cce(
  tf.constant([ [1,0]    [1,0],    [1, 0],   [0, 1]   ], tf.float32),
  tf.constant([[1,2],[3,4],[5,6],[7,8]], tf.float32))

当您有很多类别时,SparseCategoricalCrossentropy更有效率。

票数 30
EN

Stack Overflow用户

发布于 2020-01-23 06:12:30

我想补充一些可能会让人困惑的东西。SparseCategoricalCrossentropy有两个非常重要的参数需要指定。第一个是from_logits;召回逻辑是一个网络的输出,它没有通过Softmax(或Sigmoid)进行规范化。第二个是reduction。它通常被设置为'auto',它将范畴交叉熵计算为正常值,这是label*log(pred)的平均值。但是将值设置为'none'实际上会给出分类交叉熵label*log(pred)的每个元素,这是形状的(batch_size)。计算此列表中的reduce_mean将给出与reduction='auto'相同的结果。

代码语言:javascript
复制
# Assuming TF2.x
import tensorflow as tf

model_predictions = tf.constant([[1,2], [3,4], [5,6], [7,8]], tf.float32)
labels_sparse = tf.constant([1, 0, 0, 1 ], tf.float32)
labels_dense = tf.constant([[1,0], [1,0], [1,0], [0,1]], tf.float32)

loss_obj_scc = tf.keras.losses.SparseCategoricalCrossentropy(
    from_logits=True,
    reduction='auto'
)
loss_from_scc = loss_obj_scc(
    labels_sparse,
    model_predictions,
  )


loss_obj_cc = tf.keras.losses.CategoricalCrossentropy(
    from_logits=True,
    reduction='auto'
)
loss_from_cc = loss_obj_cc(
    labels_dense,
    model_predictions,
  )


print(loss_from_scc, loss_from_cc)
>> (<tf.Tensor: shape=(), dtype=float32, numpy=0.8132617>,
 <tf.Tensor: shape=(), dtype=float32, numpy=1.0632616>)
代码语言:javascript
复制
# With `reduction='none'`
loss_obj_scc_red = tf.keras.losses.SparseCategoricalCrossentropy(
    from_logits=True,
    reduction='none')

loss_from_scc_red = loss_obj_scc_red(
    labels_sparse,
    model_predictions,
  )

print(loss_from_scc_red, tf.math.reduce_mean(loss_from_scc_red))

>> (<tf.Tensor: shape=(4,), dtype=float32, numpy=array([0.31326166, 1.3132616 , 
1.3132616 , 0.31326166], dtype=float32)>,
 <tf.Tensor: shape=(), dtype=float32, numpy=0.8132617>)
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59787897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档