国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網(wǎng)站 > 幫助中心 > 正文

基于TensorFlow中自定義梯度的2種方式

2024-07-09 22:43:22
字體:
供稿:網(wǎng)友

前言

在深度學(xué)習(xí)中,有時候我們需要對某些節(jié)點的梯度進行一些定制,特別是該節(jié)點操作不可導(dǎo)(比如階梯除法如 ),如果實在需要對這個節(jié)點進行操作,而且希望其可以反向傳播,那么就需要對其進行自定義反向傳播時的梯度。在有些場景,如[2]中介紹到的梯度反轉(zhuǎn)(gradient inverse)中,就必須在某層節(jié)點對反向傳播的梯度進行反轉(zhuǎn),也就是需要更改正常的梯度傳播過程,如下圖的 所示。

在tensorflow中有若干可以實現(xiàn)定制梯度的方法,這里介紹兩種。

1. 重寫梯度法

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

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

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

#使用修飾器,建立梯度反向傳播函數(shù)。其中op.input包含輸入值、輸出值,grad包含上層傳來的梯度@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'}): #重寫梯度  x = tf.sign(x) return x #使用x = binary(x)

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

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

tf.identity( input, name=None)

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

這里再舉個反向梯度[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 -grad g = 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))

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 名山县| 桑植县| 额敏县| 莱州市| 阳高县| 会东县| 达日县| 清徐县| 繁峙县| 安远县| 海城市| 义乌市| 明水县| 于都县| 温州市| 东阿县| 新巴尔虎右旗| 南丰县| 叶城县| 灵石县| 偃师市| 台东县| 穆棱市| 金坛市| 乐山市| 美姑县| 铜鼓县| 澄江县| 桐庐县| 武平县| 收藏| 广昌县| 贡山| 乌鲁木齐县| 德兴市| 大洼县| 阿拉尔市| 西宁市| 东阿县| 九江市| 鸡西市|