全連接&GAP&Tensorlfow實現

全連接層起到將學到的“分佈式特徵表示”映射到樣本標記空間的作用。在實際使用中,全連接層可由卷積操作實現:對前層是全連接的全連接層可以轉化爲卷積核爲1x1的卷積;而前層是卷積層的全連接層可以轉化爲卷積核爲hxw的全局卷積,h和w分別爲前層卷積結果的高和寬。

在CNN中,全連接常出現在最後幾層,用於對前面設計的特徵做加權和。比如 mnist,前面的卷積和池化相當於做特徵工程,後面的全連接相當於做特徵加權。


示例:

它是怎麼樣把3x3x5的輸出,轉換成1x4096的形式

很簡單,可以理解爲在中間做了一個卷積

從上圖我們可以看出,我們用一個3x3x5的filter 去卷積激活函數的輸出,得到的結果就是一個fully connected layer 的一個神經元的輸出,這個輸出就是一個值

因爲我們有4096個神經元

我們實際就是用一個3x3x5x4096的卷積層去卷積激活函數的輸出

 

代碼:


def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)

def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)

## fc1 layer ##
# h的shape是 [n_samples, 7, 7, 64]
keep_prob = tf.placeholder(tf.float32)
W_fc1 = weight_variable([7*7*64, 1024])
b_fc1 = bias_variable([1024])
# [n_samples, 7, 7, 64] ->> [n_samples, 7*7*64]
h_flat = tf.reshape(h, [-1, 7*7*64])
h_fc1 = tf.nn.relu(tf.matmul(h_flat, W_fc1) + b_fc1)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
## fc2 layer ##
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])
prediction = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)

·  目前由於全連接層參數冗餘(僅全連接層參數就可佔整個網絡參數80%左右),近期一些性能優異的網絡模型如ResNet和GoogLeNet等均用全局平均池化(global average pooling,GAP)取代FC來融合學到的深度特徵,最後仍用softmax等損失函數作爲網絡目標函數來指導學習過程。需要指出的是,用GAP替代FC的網絡通常有較好的預測性能。

global average pooling主要是用來解決全連接的問題,其主要是是將最後一層的特徵圖進行整張圖的一個均值池化,形成一個特徵點,將這些特徵點組成最後的特徵向量。進行softmax中進行計算。舉個例子,最後的一層的數據是10個6*6的特徵圖,global average pooling是將每一張特徵圖計算所有像素點的均值,輸出一個數據值,這樣10 個特徵圖就會輸出10個數據點,將這些數據點組成一個1*10的向量的話,就成爲一個特徵向量,就可以送入到softmax的分類中計算了

代碼:


def Global_Average_Pooling(x, stride=1):
    width = np.shape(x)[1]
    pool_size = width
    return tf.layers.average_pooling1d(inputs=x, pool_size=int(pool_size), strides=stride)
a=tf.constant([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],
dtype=tf.float16)
b = tf.reshape(a,shape=(4,2,2))
c = Global_Average_Pooling(b)
sess = tf.Session()
print(sess.run(b))
print(sess.run(c)) 

原數據shape (4,2,2)

GAP後shape (4,2,1)即將原來四個樣本,每個樣本2個特徵維度,每個特徵維度有2個數據,將每個特徵維壓縮成一位

參考:https://www.zhihu.com/question/41037974/answer/150522307

https://www.zhihu.com/question/41037974/answer/320267531

https://blog.csdn.net/losteng/article/details/51520555
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章