tensorflow自定義激活函數(shù)實(shí)例
前言:因?yàn)檠芯抗ぷ鞯男枰?,要更改激活函?shù)以適應(yīng)自己的網(wǎng)絡(luò)模型,但是單純的函數(shù)替換會(huì)訓(xùn)練導(dǎo)致不能收斂。這里還有些不清楚為什么,希望有人可以給出解釋。查了一些博客,發(fā)現(xiàn)了解決之道。下面將解決過(guò)程貼出來(lái)供大家指正。
1.背景
之前聽(tīng)某位老師提到說(shuō)tensorflow可以在不給梯度函數(shù)的基礎(chǔ)上做梯度下降,所以嘗試了替換。我的例子時(shí)將ReLU改為平方。即原來(lái)的激活函數(shù)是
現(xiàn)在換成 
單純替換激活函數(shù)并不能較好的效果,在我的實(shí)驗(yàn)中,迭代到一定批次,準(zhǔn)確率就會(huì)下降,最終降為10%左右保持穩(wěn)定。而事實(shí)上,這中間最好的訓(xùn)練精度為92%。資源有限,問(wèn)了對(duì)神經(jīng)網(wǎng)絡(luò)頗有研究的同學(xué),說(shuō)是激活函數(shù)的問(wèn)題,然而某篇很厲害的論文中提到其精度在99%,著實(shí)有意思。之后開(kāi)始研究自己些梯度函數(shù)以完成訓(xùn)練。
2.大概流程
首先要確定梯度函數(shù),之后將其處理為tf能接受的類型。
2.1定義自己的激活函數(shù)
def square(x): return pow(x, 2)
2.2 定義該激活函數(shù)的一次梯度函數(shù)
def square_grad(x): return 2 * x
2.3 讓numpy數(shù)組每一個(gè)元素都能應(yīng)用該函數(shù)(全局)
square_np = np.vectorize(square) square_grad_np = np.vectorize(square_grad)
2.4 轉(zhuǎn)為tf可用的32位float型,numpy默認(rèn)是64位(全局)
square_np_32 = lambda x: square_np(x).astype(np.float32) square_grad_np_32 = lambda x: square_grad_np(x).astype(np.float32)
2.5 定義tf版的梯度函數(shù)
def square_grad_tf(x, name=None): with ops.name_scope(name, "square_grad_tf", [x]) as name: y = tf.py_func(square_grad_np_32, [x], [tf.float32], name=name, stateful=False) return y[0]
2.6 定義函數(shù)
def my_py_func(func, inp, Tout, stateful=False, name=None, my_grad_func=None):
# need to generate a unique name to avoid duplicates:
random_name = "PyFuncGrad" + str(np.random.randint(0, 1E+8))
tf.RegisterGradient(random_name)(my_grad_func)
g = tf.get_default_graph()
with g.gradient_override_map({"PyFunc": random_name, "PyFuncStateless": random_name}):
return tf.py_func(func, inp, Tout, stateful=stateful, name=name)
2.7 定義梯度,該函數(shù)依靠上一個(gè)函數(shù)my_py_func計(jì)算并傳播
def _square_grad(op, pred_grad): x = op.inputs[0] cur_grad = square_grad(x) next_grad = pred_grad * cur_grad return next_grad
2.8 定義tf版的square函數(shù)
def square_tf(x, name=None): with ops.name_scope(name, "square_tf", [x]) as name: y = my_py_func(square_np_32, [x], [tf.float32], stateful=False, name=name, my_grad_func=_square_grad) return y[0]
3.使用
跟用其他激活函數(shù)一樣,直接用就行了。input_data:輸入數(shù)據(jù)。
h = square_tf(input_data)
over. 學(xué)藝不精,多多指教!
以上這篇tensorflow自定義激活函數(shù)實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- pytorch/transformers?最后一層不加激活函數(shù)的原因分析
- python人工智能tensorflow常用激活函數(shù)Activation?Functions
- YOLO v4常見(jiàn)的非線性激活函數(shù)詳解
- python 深度學(xué)習(xí)中的4種激活函數(shù)
- 使用keras實(shí)現(xiàn)非線性回歸(兩種加激活函數(shù)的方式)
- Keras 中Leaky ReLU等高級(jí)激活函數(shù)的用法
- pytorch方法測(cè)試——激活函數(shù)(ReLU)詳解
- 詳解Python中常用的激活函數(shù)(Sigmoid、Tanh、ReLU等)
相關(guān)文章
用python生成mysql數(shù)據(jù)庫(kù)結(jié)構(gòu)文檔
大家好,本篇文章主要講的是用python生成mysql數(shù)據(jù)庫(kù)結(jié)構(gòu)文檔,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01
python中將函數(shù)賦值給變量時(shí)需要注意的一些問(wèn)題
變量賦值是我們?cè)谌粘i_(kāi)發(fā)中經(jīng)常會(huì)遇到的一個(gè)問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于python中將函數(shù)賦值給變量時(shí)需要注意的一些問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-08-08
Python實(shí)現(xiàn)自動(dòng)化對(duì)Word文檔添加或移除行號(hào)
Word文檔中的行號(hào)(行編號(hào))功能是對(duì)于精細(xì)化的文檔編輯以及解析非常有用的功能,添加行號(hào)能夠極大地提升文檔的可讀性和定位效率,本文將介紹如何使用Python來(lái)實(shí)現(xiàn)自動(dòng)化對(duì)Word文檔添加或移除行號(hào),為文檔處理工作帶來(lái)便捷,需要的朋友可以參考下2024-07-07
python 動(dòng)態(tài)調(diào)用函數(shù)實(shí)例解析
這篇文章主要介紹了python 動(dòng)態(tài)調(diào)用函數(shù)實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Appium+python+unittest搭建UI自動(dòng)化框架的實(shí)現(xiàn)
本文主要介紹了Appium+python+unittest搭建UI自動(dòng)化框架的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03
通過(guò)5個(gè)例子讓你學(xué)會(huì)Pandas中的字符串過(guò)濾
毋庸置疑Pandas是使用最廣泛的Python庫(kù)之一,它提供了許多功能和方法來(lái)執(zhí)行有效的數(shù)據(jù)處理和數(shù)據(jù)分析,下面這篇文章主要給大家介紹了關(guān)于如何通過(guò)5個(gè)例子讓你學(xué)會(huì)Pandas中字符串過(guò)濾的相關(guān)資料,需要的朋友可以參考下2022-08-08

