python人工智能自定義求導(dǎo)tf_diffs詳解
自定義求導(dǎo):(近似求導(dǎo)數(shù)的方法)
讓x向左移動eps得到一個點,向右移動eps得到一個點,這兩個點形成一條直線,這個點的斜率就是x這個位置的近似導(dǎo)數(shù)。
eps足夠小,導(dǎo)數(shù)就足夠真。
def f(x): return 3. * x ** 2 + 2. * x - 1 def approximate_derivative(f, x, eps=1e-3): return (f(x + eps) - f(x - eps)) / (2. * eps) print(approximate_derivative(f, 1.))
運行結(jié)果:
7.999999999999119
多元函數(shù)的求導(dǎo)
def g(x1, x2): return (x1 + 5) * (x2 ** 2) def approximate_gradient(g, x1, x2, eps=1e-3): dg_x1 = approximate_derivative(lambda x: g(x, x2), x1, eps) dg_x2 = approximate_derivative(lambda x: g(x1, x), x2, eps) return dg_x1, dg_x2 print(approximate_gradient(g, 2., 3.))
運行結(jié)果:
(8.999999999993236, 41.999999999994486)
在tensorflow中的求導(dǎo)
x1 = tf.Variable(2.0) x2 = tf.Variable(3.0) with tf.GradientTape() as tape: z = g(x1, x2) dz_x1 = tape.gradient(z, x1) print(dz_x1)
運行結(jié)果:
tf.Tensor(9.0, shape=(), dtype=float32)
但是tf.GradientTape()只能使用一次,使用一次之后就會被消解
try: dz_x2 = tape.gradient(z, x2) except RuntimeError as ex: print(ex)
運行結(jié)果:
A non-persistent GradientTape can only be used to compute one set of gradients (or jacobians)
解決辦法:設(shè)置persistent = True,記住最后要把tape刪除掉
x1 = tf.Variable(2.0) x2 = tf.Variable(3.0) with tf.GradientTape(persistent = True) as tape: z = g(x1, x2) dz_x1 = tape.gradient(z, x1) dz_x2 = tape.gradient(z, x2) print(dz_x1, dz_x2) del tape
運行結(jié)果:
tf.Tensor(9.0, shape=(), dtype=float32) tf.Tensor(42.0, shape=(), dtype=float32)
使用tf.GradientTape()
同時求x1,x2的偏導(dǎo)
x1 = tf.Variable(2.0) x2 = tf.Variable(3.0) with tf.GradientTape() as tape: z = g(x1, x2) dz_x1x2 = tape.gradient(z, [x1, x2]) print(dz_x1x2)
運行結(jié)果:
[<tf.Tensor: shape=(), dtype=float32, numpy=9.0>, <tf.Tensor: shape=(), dtype=float32, numpy=42.0>]
對常量求偏導(dǎo)
x1 = tf.constant(2.0) x2 = tf.constant(3.0) with tf.GradientTape() as tape: z = g(x1, x2) dz_x1x2 = tape.gradient(z, [x1, x2]) print(dz_x1x2)
運行結(jié)果:
[None, None]
可以使用watch函數(shù)關(guān)注常量上的導(dǎo)數(shù)
x1 = tf.constant(2.0) x2 = tf.constant(3.0) with tf.GradientTape() as tape: tape.watch(x1) tape.watch(x2) z = g(x1, x2) dz_x1x2 = tape.gradient(z, [x1, x2]) print(dz_x1x2)
運行結(jié)果:
[<tf.Tensor: shape=(), dtype=float32, numpy=9.0>, <tf.Tensor: shape=(), dtype=float32, numpy=42.0>]
也可以使用兩個目標函數(shù)對一個變量求導(dǎo):
x = tf.Variable(5.0) with tf.GradientTape() as tape: z1 = 3 * x z2 = x ** 2 tape.gradient([z1, z2], x)
運行結(jié)果:
<tf.Tensor: shape=(), dtype=float32, numpy=13.0>
結(jié)果13是z1對x的導(dǎo)數(shù)加上z2對于x的導(dǎo)數(shù)
求二階導(dǎo)數(shù)的方法
x1 = tf.Variable(2.0) x2 = tf.Variable(3.0) with tf.GradientTape(persistent=True) as outer_tape: with tf.GradientTape(persistent=True) as inner_tape: z = g(x1, x2) inner_grads = inner_tape.gradient(z, [x1, x2]) outer_grads = [outer_tape.gradient(inner_grad, [x1, x2]) for inner_grad in inner_grads] print(outer_grads) del inner_tape del outer_tape
運行結(jié)果:
[[None, <tf.Tensor: shape=(), dtype=float32, numpy=6.0>], [<tf.Tensor: shape=(), dtype=float32, numpy=6.0>, <tf.Tensor: shape=(), dtype=float32, numpy=14.0>]]
結(jié)果是一個2x2的矩陣,左上角是z對x1的二階導(dǎo)數(shù),右上角是z先對x1求導(dǎo),在對x2求導(dǎo)
左下角是z先對x2求導(dǎo),在對x1求導(dǎo),右下角是z對x2的二階導(dǎo)數(shù)
學(xué)會自定義求導(dǎo)就可以模擬梯度下降法了,梯度下降就是求導(dǎo),再在導(dǎo)數(shù)的位置前進一點點 模擬梯度下降法:
learning_rate = 0.1 x = tf.Variable(0.0) for _ in range(100): with tf.GradientTape() as tape: z = f(x) dz_dx = tape.gradient(z, x) x.assign_sub(learning_rate * dz_dx) print(x)
運行結(jié)果:
<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=-0.3333333>
結(jié)合optimizers進行梯度下降法
learning_rate = 0.1 x = tf.Variable(0.0) optimizer = keras.optimizers.SGD(lr = learning_rate) for _ in range(100): with tf.GradientTape() as tape: z = f(x) dz_dx = tape.gradient(z, x) optimizer.apply_gradients([(dz_dx, x)]) print(x)
運行結(jié)果:
<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=-0.3333333>
以上就是python人工智能自定義求導(dǎo)tf_diffs詳解的詳細內(nèi)容,更多關(guān)于python自定義求導(dǎo)tf_diffs的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python3中小括號()、中括號[]、花括號{}的區(qū)別詳解
這篇文章主要介紹了Python3中小括號()、中括號[]、花括號{}的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11解決python 未發(fā)現(xiàn)數(shù)據(jù)源名稱并且未指定默認驅(qū)動程序的問題
今天小編就為大家分享一篇解決python 未發(fā)現(xiàn)數(shù)據(jù)源名稱并且未指定默認驅(qū)動程序的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python中Collections模塊的Counter容器類使用教程
Counter是Python標準庫提供的一個非常有用的容器,可以用來對序列中出現(xiàn)的各個元素進行計數(shù),下面就來一起看一下Python中Collections模塊的Counter容器類使用教程2016-05-05Python的Flask框架中實現(xiàn)簡單的登錄功能的教程
這篇文章主要介紹了Python的Flask框架中實現(xiàn)簡單的登錄功能的教程,登錄是各個web框架中的基礎(chǔ)功能,需要的朋友可以參考下2015-04-04python?scapy抓包獲取udp并轉(zhuǎn)發(fā)的操作步驟
這篇文章主要介紹了python?scapy抓包獲取udp并轉(zhuǎn)發(fā)的操作步驟,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01Python使用plt庫實現(xiàn)繪制動態(tài)曲線圖并導(dǎo)出為GIF或MP4
這篇文章主要為大家詳細介紹了Python如何使用plt庫實現(xiàn)繪制動態(tài)曲線圖并導(dǎo)出為GIF或MP4,文中的示例代碼講解詳細,需要的可以了解一下2024-03-03Python編程實現(xiàn)雙擊更新所有已安裝python模塊的方法
這篇文章主要介紹了Python編程實現(xiàn)雙擊更新所有已安裝python模塊的方法,涉及Python針對模塊操作命令的相關(guān)封裝與調(diào)用技巧,需要的朋友可以參考下2017-06-06