https://www.zhihu.com/question/54513728
name_scope, variable_scope等如何理解
交叉熵
交叉熵刻画的是两个概率分布之间的距离,是分类问题中使用比较广泛的损失函数之一。给定两个概率分布p和q,通过交叉熵计算的两个概率分布之间的距离为:
我们通过softmax回归将神经网络前向传播得到的结果变成交叉熵要求的概率分布得分。
T
Tensorflow中定义的交叉熵函数如下:
def softmax_cross_entropy_with_logits(_sentinel=None, # pylint: disable=invalid-name
labels=None, logits=None,
dim=-1, name=None):
"""Computes softmax cross entropy between `logits` and `labels`."""
- logits: 神经网络的最后一层输出,如果有batch的话,它的大小为[batch_size, num_classes], 单样本的话大小就是num_classes
- labels: 样本的实际标签,大小与logits相同。且必须采用labels=y_,logits=y的形式将参数传入。
具体的执行流程大概分为两步,第一步首先是对网络最后一层的输出做一个softmax,这一步通常是求取输出属于某一类的概率,对于单样本而言,就是输出一个num_classes大小的向量[Y1,Y2,Y3,....],其中Y1,Y2,Y3Y1,Y2,Y3分别表示属于该类别的概率, softmax的公式为:
第二步是对softmax输出的向量[Y1,Y2,Y3,...]和样本的时机标签做一个交叉熵,公式如下:
其中y′i指代实际标签向量中的第i个值,yi就是softmax的输出向量[Y1,Y2,Y3,...]中的第i个元素的值。
显而易见。预测yi越准确,结果的值就越小(前面有负号),最后求一个平均,就得到我们想要的loss了
这里需要注意的是,这个函数返回值不是一个数,而是一个向量,如果要求交叉熵,我们要在做一步tf.resuce_sum操作,就是对向量里面的所有元素求和, 最后就能得到Hy′(y),如果要求loss,则需要做一步tf.reduce_mean操作,对向量求均值.
warning:
- Tenosrflow中集成的交叉熵操作是施加在未经过Softmax处理的logits上, 这个操作的输入logits是未经缩放的, 该操作内部会对logits使用Softmax操作。
- 参数labels,ligits必须有相同的shape,如:[batch_size, num_classes]和相同的类型, 如:[(float16, float32, float64)中的一种]。