tensorflow 2.0 (三)损失函数——MSE\Entropy\Hinge Loss

计算预测值与正确解之间的误差是很重要的一步,一般有三种计算误差的方式

1.MSE =>

有以下两种表现形式
在这里插入图片描述
在这里插入图片描述
来看看代码实现:

import tensorflow as tf
y = tf.constant([1,2,3,0,2])
y = tf.one_hot(y, depth=4)
y = tf.cast(y, dtype=tf.float32)

out = tf.random.normal([5,4])

loss1 = tf.reduce_mean(tf.square(y - out))
loss2 = tf.square(tf.norm(y - out)) / (5*4) # norm范式平方(tf.square(y-out)),再除以总的数据(其实就是reduce_mean)
loss3 = tf.reduce_mean(tf.losses.MSE(y, out)) # MSE

print(loss1)
print(loss2)
print(loss3)

结果:可以发现都是一样的
在这里插入图片描述
然后了解一下惊喜度的概念:越是混乱不均匀(或者可以理解为方差越大),惊喜度越高。
再来看个例子:

a = tf.fill([4], 0.25)    # [0.25, 0.25, 0.25, 0.25]
b = tf.reduce_sum(a * tf.math.log(a) / tf.math.log(2.) )
# tensorflow的不方便之处,其实b = loge (a) / loge (2.) = log2 (a) (以2为底的log a)
print(-b)
#结果:
# tf.Tensor(2.0, shape=(), dtype=float32)

a = tf.constant([0.1, 0.1, 0.1, 0.7])
b = tf.reduce_sum(a * tf.math.log(a) / tf.math.log(2.) )
print(-b)
#结果:
# tf.Tensor(1.3567797, shape=(), dtype=float32)

其实上面两个例子可以看出:概率分布越均匀,惊喜度越低(我print是加了负号的),越不均匀,惊喜度越高

2.Entropy =>

在这里插入图片描述
下面是求导的推导公式:
1.当 i = j
tensorflow 2.0 (三)损失函数——MSE\Entropy\Hinge Loss_第1张图片
2.当 i ≠ j
tensorflow 2.0 (三)损失函数——MSE\Entropy\Hinge Loss_第2张图片
下面来看看实战:

x = tf.random.normal([2,4])
w = tf.random.normal([4,3])
b = tf.zeros([3])
y = tf.constant([2,0])

with tf.GradientTape() as tape:
    tape.watch([w, b])
    logits = x@w + b
    loss = tf.reduce_mean(
    		tf.losses.categorical_crossentropy(tf.one_hot(y, depth=3), logits, from_logits=True))
			# categorical 特意指的是分类问题,from_logits 使得原数据比较稳定
grads = tape.gradient(loss, [w,b])   # loss 分别对 w, b 求偏导
print(grads)
print(grads[1])

输出结果如下:

[, ]

你可能感兴趣的:(深度学习,TensorFlow2.0)