比较与tf.nn.softmax_cross_entropy_with_logits的功能差异

查看源文件

tf.nn.softmax_cross_entropy_with_logits

tf.nn.softmax_cross_entropy_with_logits(labels, logits, axis=-1, name=None) -> Tensor

更多内容详见tf.nn.softmax_cross_entropy_with_logits

mindspore.nn.SoftmaxCrossEntropyWithLogits

class mindspore.nn.SoftmaxCrossEntropyWithLogits(sparse=False, reduction='none')(logits, labels) -> Tensor

更多内容详见mindspore.nn.SoftmaxCrossEntropyWithLogits

差异对比

TensorFlow:TensorFlow中该算子是函数式,可以直接调用算子接受logitslabels输入,并返回输出结果。参数labelslogits的shape需一致,可指定axis参数指定‘类’所在的维度。

MindSpore:MindSpore中该算子需要实例化,实例化时可接受sparse参数表示输入的labels是否是稀疏表示,默认为False;可接受reduction参数表示输入结果的规约方式,取值为meansumnone,默认为none

分类

子类

TensorFlow

MindSpore

差异

参数

参数1

labels

labels

MindSpore在实例化函数中接收此参数,功能一致

参数2

logits

logits

MindSpore在实例化函数中接收此参数,功能一致

参数3

axis

-

TensorFlowaxis参数指定‘类’所在的维度,如axis=-1表示最后一个维度作为‘类’的维度,MindSpore无此参数

参数4

name

-

不涉及

参数5

-

sparse

MindSpore实例化时可以接受sparse指定输入的labels是否为稀疏表示,TensorFlow无此参数

参数6

-

reduction

MindSpore可对输出结果进行规约,TensorFlow无此参数

代码示例1

两API实现功能一致,但是TensorFlow该算子是函数式的,直接接受输入。MindSpore中需要先实例化。

# TensorFlow
import tensorflow as tf
from tensorflow import nn

logits = tf.constant([[4.0, 2.0, 1.0], [0.0, 5.0, 1.0]], dtype=tf.float32)
labels = tf.constant([[1.0, 0.0, 0.0], [0.0, 0.8, 0.2]], dtype=tf.float32)

out = nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)
print(out.numpy())
# [0.16984604 0.82474494]

# MindSpore
import numpy as np
import mindspore
from mindspore import Tensor, nn

logits = Tensor(np.array([[4.0, 2.0, 1.0], [0.0, 5.0, 1.0]]), mindspore.float32)
labels = Tensor(np.array([[1.0, 0.0, 0.0], [0.0, 0.8, 0.2]]), mindspore.float32)

loss = nn.SoftmaxCrossEntropyWithLogits()
out = loss(logits, labels)
print(out)
# [0.16984606 0.82474494]

代码示例2

TensorFlow中可接受axis参数指定’类’所在维度。MindSpore默认最后一维,因为接受的logitsshape[batch_size, num_classes],MindSpore可以通过调用Transpose算子交换axis实现相同的功能。

# TensorFlow
import tensorflow as tf
from tensorflow import nn
logits = tf.constant([[4.0, 0.0], [2.0, 5.0], [1.0, 1.0]], dtype=tf.float32)
labels = tf.constant([[1.0, 0.0], [0.0, 0.8], [0.0, 0.2]], dtype=tf.float32)
out = nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits, axis=0)
print(out.numpy())
# [0.16984604 0.82474494]

# MindSpore
import numpy as np
import mindspore
from mindspore import Tensor, nn, ops

logits_ = Tensor(np.array([[4.0, 0.0], [2.0, 5.0], [1.0, 1.0]]), mindspore.float32)
labels_ = Tensor(np.array([[1.0, 0.0], [0.0, 0.8], [0.0, 0.2]]), mindspore.float32)
transpose = ops.Transpose()
logits = transpose(logits_, (1, 0))
labels = transpose(labels_, (1, 0))
loss = nn.SoftmaxCrossEntropyWithLogits()
out = loss(logits, labels)
print(out)
# [0.16984606 0.82474494]