tf中的误差计算
tensoflow中主要有三种误差计算方式,即均方误差(MSE),交叉熵,铰链损失函数(适用于SVM)
1. 均方误差(MSE)
- 概念:均方误差的表达式为 l o s s = ∑ ( y − o u t ) 2 N loss = \dfrac{\sum(y-out)^2}{N} loss=N∑(y−out)2其中N是为了更好地进行梯度下降,避免弥散和爆炸,一般取batch大小
- 以下展现了三种军方无擦的写法,分别是按数学式实现(loss1),2范数实现(loss2),tf自带的MSE函数实现(loss3)
2. 交叉熵
- 概念:熵的数学式如下,熵代表信息量的大小(越小越不确定,信息量越大) E n t r o p y = − ∑ i p ( i ) log p ( i ) Entropy=-\sum_{i}p(i)\log p(i) Entropy=−i∑p(i)logp(i)交叉熵(cross entropy)的数学式如下 H ( p , q ) = − ∑ p ( x ) log q ( x ) H(p,q)=-\sum p(x)\log q(x) H(p,q)=−∑p(x)logq(x)其中p为输入,q为输出。当p为one_hot编码,式子化简为下式,其中q为p中1位置对应的输出概率 H ( p , q ) = − log q i H(p,q)=-\log q_i H(p,q)=−logqi
- 交叉熵理解(不同概率下对比)
- 大部分情况(分类),输出需要经过softmax在计算损失函数,这种方法可能会存在将输出变为0的情况,因此采用tf.losses.categorical_crossentropy(y_true,y_pred,from_logits=True)其中from_logits=True表示输出结果未作softmax(推荐这种避免输出变为0的情况),from_logits=False表示输出结果已作softmax,默认为False
import tensorflow as tf
x = tf.random.normal([1, 784])
w = tf.random.normal([784, 2])
b = tf.zeros([2])
pred = x@w+b
# pred = tf.transpose(pred)
print(pred)
prob = tf.math.softmax(pred, axis=1)
# prob = tf.transpose(prob)
print(prob)
a = tf.losses.categorical_crossentropy([[0., 1.]], pred, from_logits=True)
b = tf.losses.categorical_crossentropy([[0., 1.]], prob)
print(a)
print(b)