Tensorflow中PRelu實現細節

2021-09-19 12:07:03 字數 1755 閱讀 2408

本次介紹prelu啟用函式,方法來自於何凱明***** 《delving deep into rectifiers:surpassing human-level performance on imagenet classification》.

prelu(parametric rectified linear unit), 顧名思義:帶引數的relu。二者的定義和區別如下圖: 

如果ai=0,那麼prelu退化為relu;如果ai是乙個很小的固定值(如ai=0.01),則prelu退化為leaky relu(lrelu)。 有實驗證明,與relu相比,lrelu對最終的結果幾乎沒什麼影響。

prelu的幾點說明

(1) prelu只增加了極少量的引數,也就意味著網路的計算量以及過擬合的危險性都只增加了一點點。特別的,當不同channels使用相同的ai時,引數就更少了。

(2) bp更新ai時,採用的是帶動量的更新方式,如下圖:

上式的兩個係數分別是動量和學習率。 

需要特別注意的是:更新ai時不施加權重衰減(l2正則化),因為這會把ai很大程度上push到0。事實上,即使不加正則化,試驗中ai也很少有超過1的。

(3) 整個**,ai被初始化為0.25。

方法一:

def parametric_relu(_x):

alphas = tf.get_variable('alpha', _x.get_shape()[-1],

initializer=tf.constant_initializer(0.0),

dtype=tf.float32)

pos = tf.nn.relu(_x)

neg = alphas * (_x - abs(_x)) * 0.5

return pos + neg

方法二:

def prelu(_x, scope=none):

"""parametric relu activation"""

with tf.variable_scope(name_or_scope=scope, default_name="prelu"):

_alpha = tf.get_variable("prelu", shape=_x.get_shape()[-1],

dtype=_x.dtype, initializer=tf.constant_initializer(0.1))

return tf.maximum(0.0, _x) + _alpha * tf.minimum(0.0, _x)

方法三:

import tensorflow as tf

def prelu(_x, name=none):

if name is none:

name = "alpha"

_alpha = tf.get_variable(name,

shape=_x.get_shape(),

initializer=tf.constant_initializer(0.0),

dtype=_x.dtype)

return tf.maximum(_alpha*_x, _x)

tensorflow中tfrecords使用介紹

這篇文章主要講一下如何用tensorflow中的標準資料讀取方式簡單的實現對自己資料的讀取操作 主要分為以下兩個步驟 1 將自己的資料集轉化為 xx.tfrecords的形式 2 在自己的程式中讀取並使用.tfrecords進行操作 資料集轉換 為了便於講解,我們簡單製作了乙個資料,如下圖所示 程式...

Tensorflow中dynamic rnn的用法

1 api介面dynamic rnn cell,inputs,sequence length none,initial state none,dtype none,parallel iterations none,swap memory false,time major false,scope no...

TensorFlow中遮蔽warning的方法

tensorflow的日誌級別分為以下三種 tf cpp min log level 1 預設設定,為顯示所有資訊 tf cpp min log level 2 只顯示error和warining資訊 tf cpp min log level 3 只顯示error資訊 所以,當tensorflow出...