一、python
全鏈接層的壞處就在於其會破壞圖像的空間結構,所以人們便開始用卷積層來「代替」全鏈接層,一般採用1×1的卷積核,這種不包含全鏈接的CNN成爲全卷積神經網絡(FCN),FCN最初是用於圖像分割任務,以後開始在計算機視覺領域的各類問題上獲得應用,事實上,Faster R-CNN中用來生成候選窗口的CNN就是一個FCN。FCN的特色就在於輸入和輸出都是二維的圖像,而且輸入和輸出具備相對應的空間結構,在這種狀況下,咱們能夠將FCN的輸出看做是一張熱度圖,用熱度來指示待檢測的目標的位置和覆蓋的區域。在目標所處的區域內顯示較高的熱度,而在背景區域顯示較低的熱度,這也能夠當作是對圖像上的每個像素點都進行了分類,這個點是否位於待檢測的目標上。網絡
二、spa
在實際使用中,全鏈接層可由卷積操做實現:對前層是全鏈接的全鏈接層能夠轉化爲卷積核爲1x1的卷積;而前層是卷積層的全鏈接層能夠轉化爲卷積核爲hxw的全局卷積,h和w分別爲前層卷積結果的高和寬(注1)。3d
1*1的卷積核,不會重複計算某一些方塊,因此不用padding code
三、卷積層是用來提取特徵的,不一樣的卷積覈對應了不一樣的特徵。而全鏈接層接softmax,是用來分類的blog
四、全鏈接層的參數數量怎麼計算?卷積層的參數數量?input
卷積層:io
from keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D from keras.layers import Dropout, Flatten, Dense from keras.models import Sequential model = Sequential() model.add(Conv2D(16,(2,2),input_shape=(224,224,3))) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dense(133)) model.summary()
由於是rbg,有3個通道,因此卷積核爲2*2*3有12個參數,加一個bias, weight * x + bias。因此共有13個參數ast
(keras 默認有use_bias=True)class
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 28, 28, 1) 0
_________________________________________________________________
zero_padding2d_1 (ZeroPaddin (None, 30, 30, 1) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 28, 28, 64) 640 輸入,通道爲1
_________________________________________________________________
conv2d_2 (Conv2D) (None, 26, 26, 32) 18464 通過卷積後,輸入的通道變爲64,因此卷積核也變成64通道,因此(3*3*64+1)*32 =18464
_________________________________________________________________
conv2d_3 (Conv2D) (None, 24, 24, 16) 4624
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 12, 12, 16) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 12, 12, 16) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 2304) 0
_________________________________________________________________
dense_1 (Dense) (None, 128) 295040
_________________________________________________________________
全鏈接層:
model = Sequential()
model.add(Dense(128,activation='relu',input_shape=(32,)))
model.add(Dense(10,activation='softmax'))
model.summary()
Layer (type) Output Shape Param # =================================================================dense_1 (Dense) (None, 128) 4224 輸入有32個,則須要32個w,每一個wx+b有一個偏移量,爲33個,因此33*128個神經元=4224_________________________________________________________________dense_2 (Dense) (None, 10) 1290 (128+1)*10 = 1290=================================================================Total params: 5,514Trainable params: 5,514Non-trainable params: 0_________________________________________________________________