TensorFlow学习笔记--onehot编码

onehot:顾名思义--独热

适用:因为有些数据集并非连续性的,例如常见的多分类,适用于离散型的数据集

离散型的数据集:二分类,多分类等等

连续型的数据集:语言识别,文本等等

对比普通label,和做了onehot编码的label

这里假设为四分类batch_size为4

普通标签

label = [0,1,2,3]

onehot编码标签

label = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]

代码

tf.one_hot(
    indices,#输入,这里是一维的
    depth,# one hot dimension.
    on_value=None,#output 默认1
    off_value=None,#output 默认0
    axis=None,#默认为1
    dtype=None,
    name=None
)

labels = [0,1,2,3]

labels_ = tf.one_hot(labels,4,on_value=1,axis=1)

labels_---> [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]

计算loss

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=logits_scaled, labels=labels)
loss = tf.reduce_mean(cross_entropy, name='loss')

这里发两个损失函数的对比:

两个函数虽然功能类似,但是其参数labels有明显区别。tf.nn.softmax_cross_entropy_with_logits()中的logits和labels的shape都是[batch_size, num_classes],而tf.nn.sparse_softmax_cross_entropy_with_logits()中的labels是稀疏表示的,是 [0,num_classes)中的一个数值,代表正确分类结果。即sparse_softmax_cross_entropy_with_logits 直接用标签计算交叉熵,而 softmax_cross_entropy_with_logits 是标签的onehot向量参与计算。softmax_cross_entropy_with_logits 的 labels 是 sparse_softmax_cross_entropy_with_logits 的 labels 的一个独热版本(one hot version)。

猜你喜欢

转载自blog.csdn.net/qq_41004007/article/details/82288599