Maxout 的簡單理解與實現

2021-09-26 06:16:34 字數 3665 閱讀 3755

maxout 是 goodfellow 在 2013 年提出的乙個新的啟用函式,相比於其它的啟用函式,maxout 本身是需要引數的,引數可以通過網路的反向傳播得到學習,相應地,它比其它啟用函式有著更好的效能,理論上可以擬合任意凸函式,進而使得網路取得更好的效能

maxout 可以說是乙個啟用函式,但與其他啟用函式所不同的是,它本身是擁有引數的,正因為此,它可以擬合任意的凸函式,那麼它是如何實現的呢?

首先我們弄清乙個問題,卷積層在通道階上和全連線層並沒有任何區別,只是額外在影象的兩個階增加了卷積核的稀疏連線,但這往往是很小的(3×3

3 \times 3

3×3 ,5×5

5 \times 5

5×5 這樣),所以說我們只考慮卷積網路的最後乙個階的話,它與全連線並無區別,這裡就直接使用全連線網路作為例子,當然,卷積網路也是適用的

我們網路前層進行 wx+

bwx + b

wx+b

的線性變換後,是需要增加啟用函式進行非線性變換的,但是具體怎麼選擇啟用函式呢?我們可不可以讓網路自己學習這個呢?

上圖便是最基本的 max

ou

tmaxout

maxout

連線示意圖,前面與普通的全連線並無區別,之後每兩個單元「連線」到乙個單元上,當然,這裡不是真的連線,因為該條線上並不涉及引數,那麼如何從兩個單元得到乙個單元的值呢?其實只需要比較兩個單元的值即可,大的值便可以通過~也便是 max

ou

tmax\ out

maxout

結果便如上圖所示,每兩個單元中較大的值會被啟用

我們知道每個單元都是前層特徵的線性組合,那麼比如上圖中第乙個單元學習到了 y=0

y = 0

y=0 ,而第二個單元學習到了 y=x

y = x

y=x ,那麼這兩個單元學習到的啟用函式便是 rel

urelu

relu

啟用函式

更一般地,我們使每 k

kk (前面的例子 k=2

k = 2

k=2)個單元「連線」到乙個單元上,那麼 max

ou

tmaxout

maxout

可以學習到更多段的分段函式作為啟用函式,當 k

kk 足夠大時,理論上可以擬合任何凸函式

首先令前層單元數為 d

dd,後層單元數為 m

mm,max

ou

tmaxout

maxout

單元擴增倍數為 k

kk (即每 k

kk 個單元「連線」到乙個單元)

那麼我們要怎麼實現這樣的 max

ou

tmaxout

maxout

啟用呢?

一種方式是對整個網路層進行重構,原來,即原本 d×m

d \times m

d×m 個引數改為 d×m

×k

d \times m \times k

d×m×

k 個引數,之後從中挑選出最大的即可,比如下面的**

import tensorflow as tf

x = tf.random_normal([1,3])

m = 3

k = 2

d = x.get_shape().as_list()[-1]

w = tf.variable(tf.random_normal(shape=[d, m, k]))

b = tf.variable(tf.random_normal(shape = [m, k]))

dot_z = tf.tensordot(x, w, axes=1) + b

z = tf.reduce_max(dot_z, axis=2)

with tf.session() as sess:

sess.run(tf.global_variables_initializer())

print(sess.run([x, dot_z, z]))

另一種方式是按照 max

ou

tmaxout

maxout

為乙個啟用函式,搭建完線性變換部分(d

dd 個單元連線到 k×m

k \times m

k×m 個單元)後,再進行 res

hape

reshape

reshap

e 分為 k

kk 組,之後每組挑選出最大的即可,參考tf.contrib.layers.maxout,實現如下

def

maxout

(inputs, num_units, axis=

none):

""" 將前層部分引數作為 maxout 的引數進行處理 """

shape = inputs.get_shape(

).as_list(

)if axis is

none

:# assume that channel is the last dimension

axis =-1

num_channels = shape[axis]

if num_channels % num_units:

raise valueerror(

'number of features({}) is not a multiple of num_units({})'

.format

(num_channels, num_units)

) shape[axis]

= num_units

shape +=

[num_channels // num_units]

for i in

range

(len

(shape)):

if shape[i]

isnone

: shape[i]=-

1 outputs = tf.reduce_max(tf.reshape(inputs, shape),-

1, keepdims=

false

)return outputs

# x.shape = (..., d)

x = tf.layers.conv2d(inputs=x, filters=k * m, kernel_size, strides, padding)

# x.shape = (..., m*k)

x = maxout(inputs=x, num_units=m)

# x.shape = (..., m)

相比於前一種方式,這種方式操作起來更加方便,可以不對原有網路結構進行改變便可實現 max

ou

tmaxout

maxout

啟用,但是要注意的一點是,前面的線性變換輸出單元數是 m×k

m \times k

m×k 而不是 m

mm ,經過 max

ou

tmaxout

maxout

啟用後輸出單元數才是 mmm

tensorflow 文件 maxout

*****: maxout networks

maxout 啟用函式原理及實現

Maxout的深入理解

轉之 maxout出現在icml2013上,作者goodfellow將maxout和dropout結合後,號稱在mnist,cifar 10,cifar 100,svhn這4個資料上都取得了start of art的識別率。從 中可以看出,maxout其實一種激發函式形式。通常情況下,如果激發函式採...

everything原理解釋與簡單實現。

外面疫情正嚴重,老師也還沒開始上課,我都在家宅了乙個多月了。實在是閒的無聊。學習?怎麼可能,學習是不可能學習的,這輩子都不可能學習的。前幾天,在和大佬聊天的時候,偶然聽說了乙個名叫everything的軟體,可以很方便的查詢電腦內的檔案位置,據說可以秒出結果。只不過只針對ntfs檔案系統的盤。在網上...

KMP的簡單實現和理解

在沒介紹之前我們先上乙個bf的字串匹配演算法的 include include include using namespace std void bao char a,char b else if j x intmain 執行結果 執行結果為從0開始的下標 因為kmp是上面這個 的優化版,所以因先看...