1. 程式人生 > 程式設計 >在Tensorflow中實現leakyRelu操作詳解(高效)

在Tensorflow中實現leakyRelu操作詳解(高效)

從github上轉來,實在是厲害的想法,什麼時候自己也能寫出這種精妙的程式碼就好了

原地址:簡易高效的LeakyReLu實現

程式碼如下:

我做了些改進,因為實在tensorflow中使用,就將原來的abs()函式替換成了tf.abs()

import tensorflow as tf
def LeakyRelu(x,leak=0.2,name="LeakyRelu"):
   with tf.variable_scope(name):
     f1 = 0.5 * (1 + leak)
     f2 = 0.5 * (1 - leak)
     return f1 * x + f2 * tf.abs(x) # 這裡和原文有不一樣的,我沒試驗過原文的程式碼,但tf.abs()肯定是對的

補充知識:啟用函式ReLU、Leaky ReLU、PReLU和RReLU

“啟用函式”能分成兩類——“飽和啟用函式”和“非飽和啟用函式”。

在Tensorflow中實現leakyRelu操作詳解(高效)

sigmoid和tanh是“飽和啟用函式”,而ReLU及其變體則是“非飽和啟用函式”。使用“非飽和啟用函式”的優勢在於兩點:

1.首先,“非飽和啟用函式”能解決所謂的“梯度消失”問題。

2.其次,它能加快收斂速度。

Sigmoid函式需要一個實值輸入壓縮至[0,1]的範圍

σ(x) = 1 / (1 + exp(−x))

tanh函式需要講一個實值輸入壓縮至 [-1,1]的範圍

tanh(x) = 2σ(2x) − 1

ReLU

ReLU函式代表的的是“修正線性單元”,它是帶有卷積影象的輸入x的最大函式(x,o)。ReLU函式將矩陣x內所有負值都設為零,其餘的值不變。ReLU函式的計算是在卷積之後進行的,因此它與tanh函式和sigmoid函式一樣,同屬於“非線性啟用函式”。這一內容是由Geoff Hinton首次提出的。

ELUs

ELUs是“指數線性單元”,它試圖將啟用函式的平均值接近零,從而加快學習的速度。同時,它還能通過正值的標識來避免梯度消失的問題。根據一些研究,ELUs分類精確度是高於ReLUs的。下面是關於ELU細節資訊的詳細介紹:

在Tensorflow中實現leakyRelu操作詳解(高效)

Leaky ReLUs

ReLU是將所有的負值都設為零,相反,Leaky ReLU是給所有負值賦予一個非零斜率。Leaky ReLU啟用函式是在聲學模型(2013)中首次提出的。以數學的方式我們可以表示為:

在Tensorflow中實現leakyRelu操作詳解(高效)

ai是(1,+∞)區間內的固定引數。

引數化修正線性單元(PReLU)

PReLU可以看作是Leaky ReLU的一個變體。在PReLU中,負值部分的斜率是根據資料來定的,而非預先定義的。作者稱,在ImageNet分類(2015,Russakovsky等)上,PReLU是超越人類分類水平的關鍵所在。

隨機糾正線性單元(RReLU)

“隨機糾正線性單元”RReLU也是Leaky ReLU的一個變體。在RReLU中,負值的斜率在訓練中是隨機的,在之後的測試中就變成了固定的了。RReLU的亮點在於,在訓練環節中,aji是從一個均勻的分佈U(I,u)中隨機抽取的數值。形式上來說,我們能得到以下結果:

在Tensorflow中實現leakyRelu操作詳解(高效)

總結

下圖是ReLU、Leaky ReLU、PReLU和RReLU的比較:

在Tensorflow中實現leakyRelu操作詳解(高效)

PReLU中的ai是根據資料變化的;

Leaky ReLU中的ai是固定的;

RReLU中的aji是一個在一個給定的範圍內隨機抽取的值,這個值在測試環節就會固定下來。

以上這篇在Tensorflow中實現leakyRelu操作詳解(高效)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。