TensorFlow2_200729系列---14、MSE求梯度实例

TensorFlow2_200729系列---14、MSE求梯度实例

一、总结

一句话总结:

tf.losses.MSE:loss = tf.reduce_mean(tf.losses.MSE(y, logits))

1、机器学习中的公式推导?

机器学习中,很多看似很复杂的公式的推导,就是非常普通的按照求导的规则来求导,比如求各种函数梯度

二、MSE求梯度实例

博客对应课程的视频位置:

import tensorflow as tf 


# 表示神经网络输入层3个节点
x=tf.random.normal([1,3])
# 表示是3个节点连两个节点
w=tf.ones([3,2])
# 表示是被连的两个节点
# 在这里也表示输出层是两个节点
b=tf.ones([2])
# 输出层为0和1
y = tf.constant([0, 1])


with tf.GradientTape() as tape:
    # watch要求梯度的参数w和b(这里w和b都是矩阵)
	tape.watch([w, b])
    # 用激活函数sigmoid
	logits = tf.sigmoid(x@w+b) 
    # 计算loss(计算预测值logits和真实值y的MSE)
	loss = tf.reduce_mean(tf.losses.MSE(y, logits))

# 计算梯度:对loss函数计算w和b对应的梯度
grads = tape.gradient(loss, [w, b])
print('w grad:', grads[0])
print('b grad:', grads[1])
w grad: tf.Tensor(
[[ 0.02753587 -0.05880144]
 [-0.03335685  0.07123186]
 [-0.11601511  0.24774435]], shape=(3, 2), dtype=float32)
b grad: tf.Tensor([ 0.06927714 -0.1479378 ], shape=(2,), dtype=float32)

2、详细分析过程(中间变量)

In [2]:
# 表示神经网络输入层3个节点
x=tf.random.normal([1,3])
x
Out[2]:
<tf.Tensor: shape=(1, 3), dtype=float32, numpy=array([[0.18152788, 0.19228849, 0.83497703]], dtype=float32)>
In [3]:
# 表示是3个节点连两个节点
w=tf.ones([3,2])
w
Out[3]:
<tf.Tensor: shape=(3, 2), dtype=float32, numpy=
array([[1., 1.],
       [1., 1.],
       [1., 1.]], dtype=float32)>
In [4]:
# 表示是被连的两个节点
# 在这里也表示输出层是两个节点
b=tf.ones([2])
# 输出层为0和1
y = tf.constant([0, 1])
y
Out[4]:
<tf.Tensor: shape=(2,), dtype=int32, numpy=array([0, 1])>
In [8]:
with tf.GradientTape() as tape:
    # watch要求梯度的参数w和b(这里w和b都是矩阵)
    tape.watch([w, b])
    print("========================x@w+b========================")
    print(x@w+b)
    # 用激活函数sigmoid
    logits = tf.sigmoid(x@w+b) 
    print("========================logits========================")
    print(logits)
    # 计算loss(计算预测值logits和真实值y的MSE)
    loss = tf.reduce_mean(tf.losses.MSE(y, logits))
    print("========================loss========================")
    print(loss)

# 计算梯度:对loss函数计算w和b对应的梯度
grads = tape.gradient(loss, [w, b])
print("========================grads========================")
print(grads)
========================x@w+b========================
tf.Tensor([[2.2087934 2.2087934]], shape=(1, 2), dtype=float32)
========================logits========================
tf.Tensor([[0.9010364 0.9010364]], shape=(1, 2), dtype=float32)
========================loss========================
tf.Tensor(0.4108302, shape=(), dtype=float32)
========================grads========================
[<tf.Tensor: shape=(3, 2), dtype=float32, numpy=
array([[ 0.0145849 , -0.00160191],
       [ 0.01544947, -0.00169686],
       [ 0.06708644, -0.00736831]], dtype=float32)>, <tf.Tensor: shape=(2,), dtype=float32, numpy=array([ 0.08034526, -0.00882457], dtype=float32)>]
In [9]:
print('w grad:', grads[0])
print('b grad:', grads[1])
w grad: tf.Tensor(
[[ 0.0145849  -0.00160191]
 [ 0.01544947 -0.00169686]
 [ 0.06708644 -0.00736831]], shape=(3, 2), dtype=float32)
b grad: tf.Tensor([ 0.08034526 -0.00882457], shape=(2,), dtype=float32)

3、softmax求多分类实例

In [14]:
import tensorflow as tf 


x=tf.random.normal([2,4])
w=tf.random.normal([4,3])
b=tf.zeros([3])
# 两次的预测结果分别是2和0
y = tf.constant([2, 0])
print(y)


with tf.GradientTape() as tape:
    tape.watch([w, b])
    prob = tf.nn.softmax(x@w+b,axis=1) 
    print(prob)
    loss = tf.reduce_mean(tf.losses.MSE(tf.one_hot(y,depth=3), prob))

grads = tape.gradient(loss, [w, b])
print('w grad:', grads[0])
print('b grad:', grads[1])
tf.Tensor([2 0], shape=(2,), dtype=int32)
tf.Tensor(
[[9.71989512e-01 1.00679705e-02 1.79424882e-02]
 [7.29947150e-01 2.69553602e-01 4.99337562e-04]], shape=(2, 3), dtype=float32)
w grad: tf.Tensor(
[[-0.05403889  0.07584023 -0.02180129]
 [ 0.01013849 -0.00606219 -0.00407629]
 [-0.03504124  0.02041196  0.01462925]
 [ 0.00705199  0.00788973 -0.01494168]], shape=(4, 3), dtype=float32)
b grad: tf.Tensor([-0.02092656  0.032325   -0.01139841], shape=(3,), dtype=float32)

计算结果数据:1和0

就是预测数据prob中最大的索引

In [ ]:
 
 
我的旨在学过的东西不再忘记(主要使用艾宾浩斯遗忘曲线算法及其它智能学习复习算法)的偏公益性质的完全免费的编程视频学习网站: fanrenyi.com;有各种前端、后端、算法、大数据、人工智能等课程。
博主25岁,前端后端算法大数据人工智能都有兴趣。
大家有啥都可以加博主联系方式(qq404006308,微信fan404006308)互相交流。工作、生活、心境,可以互相启迪。
聊技术,交朋友,修心境,qq404006308,微信fan404006308
26岁,真心找女朋友,非诚勿扰,微信fan404006308,qq404006308
人工智能群:939687837

作者相关推荐

原文地址:https://www.cnblogs.com/Renyi-Fan/p/13431430.html