zoukankan      html  css  js  c++  java
  • 使用Conv代替全连接层FC

    1、

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

    2、

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

    1*1的卷积核,不会重复计算某一些方块,所以不用padding 

    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,所以卷积核也变成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
    _________________________________________________________________

  • 相关阅读:
    第三方插件处理 json数据的易错点
    C# 生成缩略图 方法
    javascript 数组的数据删除 splice() 的问题
    System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。
    C#单的二维码生成
    “System.NullReferenceException”类型的异常在 App_Web_j2s3gau3.dll 中发生,但未在用户代码中进行处理的Bug解决方案
    C#实现简单的邮件发送功能
    Python配置管理的几种方式
    Airflow 入门教程&示例
    pandas 使用 df.product 条件筛选报错Keyerror:False
  • 原文地址:https://www.cnblogs.com/yjybupt/p/11752553.html
Copyright © 2011-2022 走看看