使用Conv代替全连接层FC

1、

全连接层的坏处就在于其会破坏图像的空间结构,因此人们便开始用卷积层来“代替”全连接层,通常采用1×1的卷积核,这种不包含全连接的CNN成为全卷积神经网络(FCN),FCN最初是用于图像分割任务,之后开始在计算机视觉领域的各种问题上得到应用,事实上,Faster R-CNN中用来生成候选窗口的CNN就是一个FCN。FCN的特点就在于输入和输出都是二维的图像,并且输入和输出具有相对应的空间结构,在这种情况下,我们可以将FCN的输出看作是一张热度图,用热度来指示待检测的目标的位置和覆盖的区域。在目标所处的区域内显示较高的热度,而在背景区域显示较低的热度,这也可以看成是对图像上的每一个像素点都进行了分类,这个点是否位于待检测的目标上。

2、

在实际使用中,全连接层可由卷积操作实现:对前层是全连接的全连接层可以转化为卷积核为1x1的卷积;而前层是卷积层的全连接层可以转化为卷积核为hxw的全局卷积,h和w分别为前层卷积结果的高和宽(注1)。

3、卷积层是用来提取特征的,不同的卷积核对应了不同的特征。而全连接层接softmax,是用来分类的

4、全连接层的参数数量怎么计算?卷积层的参数数量?

卷积层:

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个参数

(keras 默认有use_bias=True)

_________________________________________________________________
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,所以(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,514
Trainable params: 5,514
Non-trainable params: 0
_________________________________________________________________

猜你喜欢

转载自www.cnblogs.com/yjybupt/p/11752553.html