tensorflow自定義激活函數(shù)實例
前言:因為研究工作的需要,要更改激活函數(shù)以適應(yīng)自己的網(wǎng)絡(luò)模型,但是單純的函數(shù)替換會訓(xùn)練導(dǎo)致不能收斂。這里還有些不清楚為什么,希望有人可以給出解釋。查了一些博客,發(fā)現(xiàn)了解決之道。下面將解決過程貼出來供大家指正。
1.背景
之前聽某位老師提到說tensorflow可以在不給梯度函數(shù)的基礎(chǔ)上做梯度下降,所以嘗試了替換。我的例子時將ReLU改為平方。即原來的激活函數(shù)是
現(xiàn)在換成 
單純替換激活函數(shù)并不能較好的效果,在我的實驗中,迭代到一定批次,準(zhǔn)確率就會下降,最終降為10%左右保持穩(wěn)定。而事實上,這中間最好的訓(xùn)練精度為92%。資源有限,問了對神經(jīng)網(wǎng)絡(luò)頗有研究的同學(xué),說是激活函數(shù)的問題,然而某篇很厲害的論文中提到其精度在99%,著實有意思。之后開始研究自己些梯度函數(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ù)組每一個元素都能應(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ù)依靠上一個函數(shù)my_py_func計算并傳播
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ù)實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
用python生成mysql數(shù)據(jù)庫結(jié)構(gòu)文檔
大家好,本篇文章主要講的是用python生成mysql數(shù)據(jù)庫結(jié)構(gòu)文檔,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01
python中將函數(shù)賦值給變量時需要注意的一些問題
變量賦值是我們在日常開發(fā)中經(jīng)常會遇到的一個問題,下面這篇文章主要給大家介紹了關(guān)于python中將函數(shù)賦值給變量時需要注意的一些問題,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-08-08
Python實現(xiàn)自動化對Word文檔添加或移除行號
Word文檔中的行號(行編號)功能是對于精細(xì)化的文檔編輯以及解析非常有用的功能,添加行號能夠極大地提升文檔的可讀性和定位效率,本文將介紹如何使用Python來實現(xiàn)自動化對Word文檔添加或移除行號,為文檔處理工作帶來便捷,需要的朋友可以參考下2024-07-07
python 動態(tài)調(diào)用函數(shù)實例解析
這篇文章主要介紹了python 動態(tài)調(diào)用函數(shù)實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10
Appium+python+unittest搭建UI自動化框架的實現(xiàn)
本文主要介紹了Appium+python+unittest搭建UI自動化框架的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03

