Tensorflow 2 0 梯度計算

2021-10-25 15:06:03 字數 3464 閱讀 7880

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 實現深度學習的最佳實踐樣例 為了更好的介紹優化神經網路訓練過程,我們將首先介紹優化神經網路的演算法 梯度下降演算法。然後在後面的部分中,我們將圍繞該演算法中的一些元素來優化模型訓練過程。梯度下降演算法 梯度下降演算法主要用...