使用Conv代替全链接层FC

一、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_________________________________________________________________

相关文章
相关标签/搜索