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])
2、详细分析过程(中间变量)
In [2]:
# 表示神经网络输入层3个节点
x=tf.random.normal([1,3])
x
Out[2]:
In [3]:
# 表示是3个节点连两个节点
w=tf.ones([3,2])
w
Out[3]:
In [4]:
# 表示是被连的两个节点
# 在这里也表示输出层是两个节点
b=tf.ones([2])
# 输出层为0和1
y = tf.constant([0, 1])
y
Out[4]:
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)
In [9]:
print('w grad:', grads[0])
print('b grad:', grads[1])
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])
计算结果数据:1和0
就是预测数据prob中最大的索引
In [ ]: