tensorflow 提供了gradienttape函式,實現梯度的計算。
gradienttape 意思為梯度帶
persistent:預設是false.
如果是false,那麼gradient()函式最多只能呼叫一次。反之可以呼叫多次,
watch_accessed_variables:預設值是true,
可以自動對任何tensorflow 的variable求梯度。
如果是false,那麼只能顯示呼叫watch()方法對某些變數就梯度了
import tensorflow as tf
x= tf.variable(initial_value=
3.0)
with tf.gradienttape(
)as g:
y = x * x
dy_dx = g.gradient(y, x)
# will compute to 6.0
print
(dy_dx)
dy_dx = g.gradient(y, x)
print
(dy_dx)
預設情況下(persistent 是false 意思為不連續的),gradienttape 只能計算一次第二次會報錯
import tensorflow as tf
x= tf.variable(initial_value=
3.0)
with tf.gradienttape(persistent=
true
)as g:
y = x * x
dy_dx = g.gradient(y, x)
# will compute to 6.0
print
(dy_dx)
dy_dx = g.gradient(y, x)
print
(dy_dx)
將persistent 設定為true,可以多次計算了
import tensorflow as tf
x= tf.variable(initial_value=
3.0)
with tf.gradienttape(persistent=
true
)as g:
y = x * x
dy_dx = g.gradient(y, x)
# will compute to 6.0
print
(dy_dx)
x = tf.constant(
3.0)
with tf.gradienttape(persistent=
true
)as g1:
y = x * x
dy_dx = g1.gradient(y, x)
# 我們對於常量是不能進行梯度計算的
print
(dy_dx)
with tf.gradienttape(persistent=
true
)as g1:
g1.watch(x)
y = x * x
dy_dx = g1.gradient(y, x)
# will compute to 6.0
print
(dy_dx)
執行結果是
那對於常量我們不能對其進行求梯度,雖然加上 watch函式就可以了,但我不知道為什麼不直接設定x為變數呢?
是變數會比較節約資源嗎?
import tensorflow as tf
x = tf.constant(
3.0)
with tf.gradienttape(
)as g:
g.watch(x)
with tf.gradienttape(
)as gg:
gg.watch(x)
y = x * x
dy_dx = gg.gradient(y, x)
# will compute to 6.0
print
(dy_dx)
d2y_dx2 = g.gradient(dy_dx, x)
# will compute to 2.
print
(d2y_dx2)
由上述**可見 y=x^2 ,第一層得到 y`=2x 第二層得到y``=2
import tensorflow as tf
x = tf.constant(
3.0)
488dz_dx = g.gradient(z, x)
# 108.0 (4*x^3 at x = 3)
print
(dz_dx)
dy_dx = g.gradient(y, x)
# 6.0
print
(dy_dx)
對tf相關的函式求梯度
對二元函式求梯度 這個包含了偏導
num_epoch =
10000
optimizer = tf.keras.optimizers.sgd(learning_rate=5e-
4)for e in
range
(num_epoch)
:with tf.gradienttape(
)as tape:
# 使用tf.gradienttape()記錄損失函式的梯度資訊
y_pred = a * x + b
loss = tf.reduce_sum(tf.square(y_pred - y)
) grads = tape.gradient(loss, variables)
# tensorflow自動計算損失函式關於自變數(模型引數)的梯度
zip(grads, variables)
)
引數是 損失函式對變數的導數(一般包含兩個變數,權值w 和偏置 b)
即多元函式求導
with tf.gradienttape(
)as tape:
l = tf.reduce_sum(tf.square(tf.matmul(x, w)
+ b - y)
)w_grad, b_grad = tape.gradient(l,
[w, b]
)# 計算l(w, b)關於w, b的偏導數
w_grad, b_grad 就是上文中的 grad tensorflow2 0 梯度下降的實現
graph1 tf.graph with graph1.as default x tf.constant 2.0,1.0 dtype tf.float32 y tf.constant 0.0 dtype tf.float32 梯度下降法解線性方程就是不斷輸入係數x 2,1 和結果y 3 作為訓練資料...
tensorflow2 0 維度變換
a tf.random.normal 4,28,28,3 a 1 tf.reshape a,4,784,3 shape 1 a 1 tf.reshape a,4,1,3 shape 和1等價 a 2 tf.reshape a,4,784 3 shape 2 a 2 tf.reshape a,4,1 ...
TensorFlow實戰系列5 梯度下降演算法
本文將介紹優化訓練神經網路模型的一些常用方法,並給出使用tensorflow 實現深度學習的最佳實踐樣例 為了更好的介紹優化神經網路訓練過程,我們將首先介紹優化神經網路的演算法 梯度下降演算法。然後在後面的部分中,我們將圍繞該演算法中的一些元素來優化模型訓練過程。梯度下降演算法 梯度下降演算法主要用...