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)。