深层神经网络之经典损失函数

一, 交叉熵函数

交叉熵是一个信息论中的概念,但在此我们不深究它的本身意义,我们要知道,交叉熵刻画了两个概率分布之间的距离,在深度神经网络的构建中,我们知道真实值和预测值之间会存在一个差值,这也就是为什么使用交叉熵函数的原因.

给定两个概率分布p,q, 通过q来表示p的交叉熵为

H(p,q) = -∑ p(x) log q(x)

在这里我们要知道交叉熵函数刻画的是两个概率分布之间的距离,但神经网络的输出不一定是一个概率分布,所以,我们将会采用softmax回归函数,softmax回归本身可以作为一个学习算法来优化分类结果,在TensorFlow中,softmax只是一层额外的处理层,它被加在原始输出层和最终输出层中间,目的就是输出一个概率分布.

通过TensorFlow实现交叉熵函数

cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10,1.0)))

y_代表正确结果,y代表预测结果,在这里一定要知道H(p,q)和H(q,p)是不一样的,当交叉熵作为神经网络的损失函数时,前一个代表正确答案,后一个代表预测答案,这一行代码包含了4个不同的TensorFlow运算

tf.clip_by_value()函数可以将一个张量中的数值限制在一个范围内在这个里面就是将y限制在[1e-10, 1.0]这个区间内

tf.log()函数完成了对张量中所有元素依次求对数的功能

"*"和矩阵乘法是不一样的,因为在在TensorFlow中矩阵乘法需要使用matmul()函数进行相乘,在这里的相乘是元素的相乘

两者的区别

v1 = tf.constant([1,2], [3,4])    v2 = tf.constant([5,6], [7,8])

print(v1 * v2).eval() #输出[[5, 12], [21, 32]]

print(tf.matmul(v1, v2).eval())#输出[[19, 22] [43, 50]]

通过上面的三步计算,我们会得到一个n×m的矩阵,这里的n代表的是一个batch(批处理)中的所有样例的数量,m为分类的数量,然后我们要把每行中的m个结果相加得到总的交叉熵,然后在对n行取平均得到一个batch的平均交叉熵,因为交叉熵一般会和softmax一起使用,所以TensorFlow将这两个封装在了一起

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)

其中y代表原始神经网络输出结果,y_则是标准答案,

 

猜你喜欢

转载自blog.csdn.net/White__Hacker/article/details/81152133