我的学习笔记.参考:https://www.cnblogs.com/sumwailiu/p/13610588.html
1. 数学基础:参考:https://www.cnblogs.com/sumwailiu/p/13398121.html
2.tensorflow中有求梯度的函数直接调用。可以自行验证。
3.代码:
import pandas as pd
import numpy as np
import tensorflow as tf
np.random.seed(0)
def crossentropy(y_pred,y_true):
return -tf.reduce_sum(y_true*tf.math.log(y_pred))
with tf.GradientTape(persistent=True) as t:
#---------input----------
x = tf.constant(np.random.randn(1, 9, 9, 1).astype(np.float32))
y_true = np.array([0.3,0.5,0.2]).astype(np.float32)
t.watch(x) #例子中的watch函数把需要计算梯度的变量x加进来了
#-----------conv l1---------------
l1 = tf.keras.layers.Conv2D(filters=1,kernel_size=(3,3),strides=2)
z_l1 = l1(x)
t.watch(z_l1)
a_l1 = tf.nn.relu(z_l1)
t.watch(a_l1)
#---------max pooling l2----------
l2 = tf.keras.layers.MaxPool2D(pool_size=(2,2))
z_l2 = l2(a_l1)
t.watch(z_l2)
a_l2 = tf.keras.layers.Flatten()(z_l2) #3维转换成一维
t.watch(a_l2)
#--------------FNN L3----------------
l3 = tf.keras.layers.Dense(3)
z_l3 = l3(a_l2)
t.watch(z_l3)
a_l3 = tf.math.softmax(z_l3)
t.watch(a_l3)
#--------------loss----------------
loss = crossentropy(y_pred = a_l3,y_true = y_true)
print(z_l1)
print(l1.kernel.numpy())
print(a_l1)
print(np.squeeze(t.gradient(loss, l1.kernel)))
print(np.squeeze(t.gradient(loss, z_l1)))