這節我們會介紹使用tensorflow2自動求導的方法。
一、gradient tapes
tensorflow 提供tf.gradienttape api來實現自動求導功能。只要在tf.gradienttape()上下文中執行的操作,都會被記錄與「tape」中,然後tensorflow使用反向自動微分來計算相關操作的梯度。
x = tf.ones((2,2))
# 需要計算梯度的操作
with tf.gradienttape() as t:
t.watch(x)
y = tf.reduce_sum(x)
z = tf.multiply(y,y)
# 計算z關於x的梯度
dz_dx = t.gradient(z, x)
print(dz_dx)
tf.tensor(
[[8. 8.]
[8. 8.]], shape=(2, 2), dtype=float32)
也可以輸出對中間變數的導數
# 梯度求導只能每個tape一次
with tf.gradienttape() as t:
t.watch(x)
y = tf.reduce_sum(x)
z = tf.multiply(y,y)
dz_dy = t.gradient(z, y)
print(dz_dy)
tf.tensor(8.0, shape=(), dtype=float32)
預設情況下gradienttape的資源會在執行tf.gradienttape()後被釋放。如果想多次計算梯度,需要建立乙個持久的gradienttape。
with tf.gradienttape(persistent=true) as t:
t.watch(x)
y = tf.reduce_sum(x)
z = tf.multiply(y, y)
dz_dx = t.gradient(z,x)
print(dz_dx)
dz_dy = t.gradient(z, y)
print(dz_dy)
tf.tensor(
[[8. 8.]
[8. 8.]], shape=(2, 2), dtype=float32)
tf.tensor(8.0, shape=(), dtype=float32)
二、記錄控制流
因為tapes記錄了整個操作,所以即使過程中存在python控制流(如if, while),梯度求導也能正常處理。
def f(x, y):無錫**多少錢
output = 1.0
# 根據y的迴圈
for i in range(y):
# 根據每一項進行判斷
if i> 1 and i<5:
output = tf.multiply(output, x)
return output
def grad(x, y):
with tf.gradienttape() as t:
t.watch(x)
out = f(x, y)
# 返回梯度
return t.gradient(out, x)
# x為固定值
x = tf.convert_to_tensor(2.0)
print(grad(x, 6))
print(grad(x, 5))
print(grad(x, 4))
tf.tensor(12.0, shape=(), dtype=float32)
tf.tensor(12.0, shape=(), dtype=float32)
tf.tensor(4.0, shape=(), dtype=float32)
三、高階梯度
gradienttape上下文管理器在計算梯度的同時也會保持梯度,所以gradienttape也可以實現高階梯度計算,
x = tf.variable(1.0)
with tf.gradienttape() as t1:
with tf.gradienttape() as t2:
y = x * x * x
dy_dx = t2.gradient(y, x)
print(dy_dx)
d2y_d2x = t1.gradient(dy_dx, x)
print(d2y_d2x)
tf.tensor(3.0, shape=(), dtype=float32)
tf.tensor(6.0, shape=(), dtype=float32)
tensorflow2 0 建立張量2
建立全0全1張量 a tf.ones shape 3,5 print a a b tf.ones 6 print b b c tf.zeros 2,3 dtype tf.int32 print c c print 建立元素值都相同的張量 a tf.fill 3,4 3.9 print 全相同張量fi...
tensorflow2 0視訊記憶體設定
遇到乙個問題 新買顯示卡視訊記憶體8g但是tensorflow執行的時候介面顯示只有約6.3g的視訊記憶體可用,如下圖 即限制了我的視訊記憶體,具體原因為什麼我也不知道,但原來的視訊記憶體小一些的顯示卡就沒有這個問題。目前的解決辦法是 官方文件解決 然後對應的中文部落格 總結一下,就是下面的兩個辦法...
Tensorflow2 0 啟用函式
常用啟用函式及對應特點 神經網路結構的輸出為所有輸入的加權和,這導致整個神經網路是乙個線性模型。而線性模型不能解決異或問題,且面對多分類問題,也顯得束手無策。所以為了解決非線性的分類或回歸問題,啟用函式必須是非線性函式。神經網路中啟用函式的主要作用是提供網路的非線性建模能力。這是因為反向傳播演算法就...