tf中的误差计算
tensoflow中主要有三种误差计算方式,即均方误差(MSE),交叉熵,铰链损失函数(适用于SVM)
- 均方误差(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)
- 交叉熵
- 概念:熵的数学式如下,熵代表信息量的大小(越小越不确定,信息量越大)
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
print(pred)
prob = tf.math.softmax(pred, axis=1)
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)
|