真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

TensorFlow中如何自定義梯度

本篇文章給大家分享的是有關(guān)TensorFlow中如何自定義梯度,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

創(chuàng)新互聯(lián)建站自2013年創(chuàng)立以來(lái),先為自貢等服務(wù)建站,自貢等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為自貢企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

1. 重寫(xiě)梯度法

重寫(xiě)梯度法指的是通過(guò)tensorflow自帶的機(jī)制,將某個(gè)節(jié)點(diǎn)的梯度重寫(xiě)(override),這種方法的適用性最廣。我們這里舉個(gè)例子[3].

符號(hào)函數(shù)的前向傳播采用的是階躍函數(shù)y=sign(x) y = \rm{sign}(x)y=sign(x),如下圖所示,我們知道階躍函數(shù)不是連續(xù)可導(dǎo)的,因此我們?cè)诜聪騻鞑r(shí),將其替代為一個(gè)可以連續(xù)求導(dǎo)的函數(shù)y=Htanh(x) y = \rm{Htanh(x)}y=Htanh(x),于是梯度就是大于1和小于-1時(shí)為0,在-1和1之間時(shí)是1。

使用重寫(xiě)梯度的方法如下,主要是涉及到tf.RegisterGradient()和tf.get_default_graph().gradient_override_map(),前者注冊(cè)新的梯度,后者重寫(xiě)圖中具有名字name='Sign'的操作節(jié)點(diǎn)的梯度,用在新注冊(cè)的QuantizeGrad替代。

#使用修飾器,建立梯度反向傳播函數(shù)。其中op.input包含輸入值、輸出值,grad包含上層傳來(lái)的梯度@tf.RegisterGradient("QuantizeGrad")def sign_grad(op, grad): input = op.inputs[0] # 取出當(dāng)前的輸入 cond = (input>=-1)&(input<=1) # 大于1或者小于-1的值的位置 zeros = tf.zeros_like(grad) # 定義出0矩陣用于掩膜 return tf.where(cond, grad, zeros) # 將大于1或者小于-1的上一層的梯度置為0#使用with上下文管理器覆蓋原始的sign梯度函數(shù)def binary(input): x = input with tf.get_default_graph().gradient_override_map({"Sign":'QuantizeGrad'}): #重寫(xiě)梯度  x = tf.sign(x) return x#使用x = binary(x)

其中的def sign_grad(op, grad):是注冊(cè)新的梯度的套路,其中的op是當(dāng)前操作的輸入值/張量等,而grad指的是從反向而言的上一層的梯度。

通常來(lái)說(shuō),在tensorflow中自定義梯度,函數(shù)tf.identity()是很重要的,其API手冊(cè)如下:

tf.identity( input, name=None)

其會(huì)返回一個(gè)形狀和內(nèi)容都和輸入完全一樣的輸出,但是你可以自定義其反向傳播時(shí)的梯度,因此在梯度反轉(zhuǎn)等操作中特別有用。

這里再舉個(gè)反向梯度[2]的例子,也就是梯度為  而不是

import tensorflow as tfx1 = tf.Variable(1)x2 = tf.Variable(3)x3 = tf.Variable(6)@tf.RegisterGradient('CustomGrad')def CustomGrad(op, grad):#  tf.Print(grad) return -gradg = tf.get_default_graph()oo = x1+x2with g.gradient_override_map({"Identity": "CustomGrad"}): output = tf.identity(oo)grad_1 = tf.gradients(output, oo)with tf.Session() as sess: sess.run(tf.global_variables_initializer()) print(sess.run(grad_1))

因?yàn)?grad,所以這里的梯度輸出是[-1]而不是[1]。有一個(gè)我們需要注意的是,在自定義函數(shù)def CustomGrad()中,返回的值得是一個(gè)張量,而不能返回一個(gè)參數(shù),比如return 0,這樣會(huì)報(bào)錯(cuò),如:

AttributeError: 'int' object has no attribute 'name'

顯然,這是因?yàn)閠ensorflow的內(nèi)部操作需要取返回值的名字而int類型沒(méi)有名字。

PS:def CustomGrad()這個(gè)函數(shù)簽名是隨便你取的。

2. stop_gradient法

對(duì)于自定義梯度,還有一種比較簡(jiǎn)潔的操作,就是利用tf.stop_gradient()函數(shù),我們看下例子[1]:

t = g(x)y = t + tf.stop_gradient(f(x) - t)

這里,我們本來(lái)的前向傳遞函數(shù)是f(x),但是想要在反向時(shí)傳遞的函數(shù)是g(x),因?yàn)樵谇跋蜻^(guò)程中,tf.stop_gradient()不起作用,因此+t和-t抵消掉了,只剩下f(x)前向傳遞;而在反向過(guò)程中,因?yàn)閠f.stop_gradient()的作用,使得f(x)-t的梯度變?yōu)榱?,從而只剩下g(x)在反向傳遞。

我們看下完整的例子:

import tensorflow as tfx1 = tf.Variable(1)x2 = tf.Variable(3)x3 = tf.Variable(6)f = x1+x2*x3t = -fy1 = t + tf.stop_gradient(f-t)y2 = fgrad_1 = tf.gradients(y1, x1)grad_2 = tf.gradients(y2, x1)with tf.Session(config=config) as sess: sess.run(tf.global_variables_initializer()) print(sess.run(grad_1)) print(sess.run(grad_2))

第一個(gè)輸出為[-1],第二個(gè)輸出為[1],顯然也實(shí)現(xiàn)了梯度的反轉(zhuǎn)。

以上就是TensorFlow中如何自定義梯度,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)站題目:TensorFlow中如何自定義梯度
網(wǎng)站鏈接:http://weahome.cn/article/jceigs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部