【问题标题】:About mechanism/behavior of 'softmax_cross_entropy_with_logits' function on Tensorflow关于 Tensorflow 上 'softmax_cross_entropy_with_logits' 函数的机制/行为
【发布时间】:2017-11-17 12:17:41
【问题描述】:

:)

大家好。

现在,我正在使用 tensorflow 进行 Multi-hot 分类。

如果使用 softmax_cross_entropy_with_logits,损失函数会增加(例如 loss: 50 -> loss: 190000 -> loss: 2138712811 -> ...)。

因此,我想澄清一下softmax_cross_entropy_with_logits的机制。

我认为下面的python代码可以模仿softmax_cross_entropy_with_logits。

def imitation_SCEwL(logits, labels):
  _y = tf.nn.softmax(logits)
  _y = tf.clip_by_value(_y, 1e-10, 1.0)

  cross_entropy = -( labels * tf.log(_y) )
  cross_entropy = tf.reduce_sum(cross_entropy, 1, keep_dims=True)
  cross_entropy = tf.reduce_mean( cross_entropy )

  return cross_entropy

但是,正版(在 tensorflow 中实现)和上面的代码之间的行为是不同的。

使用上面的代码,损失函数收敛。

为什么? 我只更改下面的代码。

def loss_softmax_cross_entropy_with_logits(logits, labels):
  _y = tf.nn.softmax_cross_entropy_with_logits(logits, labels)
  cross_entropy = tf.reduce_mean(_y)

  return cross_entropy

【问题讨论】:

    标签: python tensorflow softmax


    【解决方案1】:

    您的逻辑的基本概念是正确的,但是当您在 imitation_SCEwL 函数中调用 softmax 时,您应该指定“dim”。

    查看以下代码计算损失: 1.numpy的实现

    def xent(features, labels, dim=-1):
      if dim is -1:
        dim = len(features.shape) - 1
      one_only_on_dim = list(features.shape)
      one_only_on_dim[dim] = 1
      e = np.exp(features - np.reshape(
          np.amax(
            features, axis=dim), one_only_on_dim))
      probs = e / np.reshape(np.sum(e, axis=dim), one_only_on_dim)
      l = -np.sum(labels * np.log(probs + 1.0e-20), axis=dim)
      return l
    
    1. tensorflow 原生实现

    ""

    def loss_softmax_cross_entropy_with_logits(np_features, np_labels, dim=-1):
        loss = nn_ops.softmax_cross_entropy_with_logits(
        labels=np_labels, logits=np_features, dim=dim)
        tf_loss = sess.run(loss)
        return tf_loss
    
    1. 函数的修订版本

    ""

    def imitation_SCEwL(logits, labels, dim=-1):
      _y = tf.nn.softmax(logits, dim=dim)
      cross_entropy = labels * (-tf.log(_y))
      cross_entropy = tf.reduce_sum(cross_entropy, 1, keep_dims=True)
      retval = sess.run(cross_entropy)
      return retval
    

    我测试了这些函数的所有损失值都是等价的。如果它们不适合您,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      • 2017-04-20
      • 1970-01-01
      • 2016-06-23
      相关资源
      最近更新 更多