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是上面這個 的優化版,所以因先看...