卷积神经网络(如caffe)个参数的定义和FLOP计算量的计算

本文介绍了卷积神经网络的基础知识,包括卷积的数学推导、局部感知域、权重共享和池化操作。详细阐述了卷积层的参数如kernel_size、stride、pad以及在Caffe中的配置,还提到了FLOP的计算方法。此外,解释了池化层和全连接层的作用,并给出了AlexNet的网络结构作为实例。
摘要由CSDN通过智能技术生成

刚开始看神经网,结合很多文章,做了一些总结,写下来也方便后面查看。有不足的地方,希望多多批评指正。

1.卷积的数学推导

先从卷积的数学推导说起,卷积的数学表达就是,即是两个变量在某范围内相乘后求和的结果。如果卷积的变量是序列x(n)和h(n),则卷积的结果又可以变成离散的方式:

从公式上看,描述了f(x)和一个经过反折和偏移的g(x)的乘子项的累加过程。基于这一点的数学意义,这两个函数zai'在不同的场景下被赋予了不同的性质,比如说,可以用来描述线性时不变系统的输入和输出的关系:即输出可以通过输入和一个表征系统特性的函数(冲激响应函数)进行卷积运算得到。

当把这个F(x)和g(x)以序列或者矩阵的形式表示的时候,yuan原来的卷积形式,完全就是这两个序列或者矩阵的乘积形式,这样就很形象了,如该博文所描述的( https://blog.csdn.net/bitcarmanlee/article/details/54729807 )以及后面会介绍到的卷积层的直观效果。

2.卷积的三个主要概念:

2.1局部感知域-local receptive field

局部感知域主要是卷积核的概念。单从卷积这一过程来说,构成下一步映射的一点只和这个局部感知域有关。这里涉及两个概念,卷积核的大小(或说边长)以及步长。具体的大小选取可以参看

论文:http://www.docin.com/p-938340381-f3.html

2.2共享权重

单一卷积核意义下的共享权重。但是由于初始权重几乎无法人为判断出来,用单一卷积核明显不靠谱,工程上往往采用多个不同的随机的权重来处理,但是不管怎么说,即使对于多卷积核的情形下,输入数据对应于单一卷积核仍然有权值共享的概念。

3池化

池化的作用也是进一步减少特征量。主要方法有局部均值和最大值。

3.卷积的作用

卷积神经网络CNN主要用来识别位移、缩放及其他形式扭曲不变性的二维图形。由于CNN的特征检测层通过训练数据进行学习,所以在使用CNN时,避免了显式的特征抽取,而隐式地从训练数据中进行学习;再者由于同一特征映射面上的神经元权值相同,所以网络可以并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优势。卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享降低了网络的复杂性,特别是多维输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度。

卷积网络较一般神经网络在图像处理方面有如下优点: a)输入图像和网络的拓扑结构能很好的吻合;b)特征提取和模式分类同时进行,并同时在训练中产生;c)权重共享可以减少网络的训练参数,使神经网络结构变得更简单,适应性更强。

4.caffe下各层概念(主要层)

4.1Convolution卷积层

lr_mult: 学习率的系数,最终的学习率是这个数乘以solver.prototxt配置文件中的base_lr。如果有两个lr_mult, 则第一个表示权值的学习率,第二个表示偏置项的学习率。一般偏置项的学习率是权值学习率的两倍。

num_output: 卷积核(filter)的个数

kernel_size: 卷积核的大小。如果卷积核的长和宽不等,需要用kernel_h和kernel_w分别设定

stride: 卷积核的步长,默认为1。也可以用stride_h和stride_w来设置。

pad: 扩充边缘,默认为0,不扩充。 扩充的时候是左右、上下对称的,比如卷积核的大小为5*5,那么pad设置为2,则四个边缘都扩充2个像素,即宽度和高度都扩充了4个像素,这样卷积运算之后的特征图就不会变小。也可以通过pad_h和pad_w来分别设定。

weight_filler: 权值初始化。 默认为“constant",值全为0,很多时候我们用"xavier"算法来进行初始化,也可以设置为”gaussian"

bias_filler: 偏置项的初始化。一般设置为"constant",值全为0。

group: 分组,默认为1组。如果大于1,我们限制卷积的连接操作在一个子集内。如果我们根据图像的通道来分组,那么第i个输出分组只能与第i个输入分组进行连接。

FLOPS的计算:输入规模(上层输出边长乘积)*(kernel_size^2+bias_filler)*num_output(这里pad=0)

4.2Pooling层

也叫池化层,为了减少运算量和数据维度而设置的一种层。

层类型:Pooling

必须设置的参数:

       kernel_size: 池化的核大小。也可以用kernel_h和kernel_w分别设定。

其它参数:

pool: 池化方法,默认为MAX。目前可用的方法有MAX, AVE, 或STOCHASTIC

      pad: 和卷积层的pad的一样,进行边缘扩充。默认为0

       stride: 池化的步长,默认为1。一般我们设置为2,即不重叠。也可以用stride_h和stride_w来设置。

FLOPS的计算:(kernel_size^2+1)*num_output*输出规模(下层输入边长乘积)

4.3全连接层

实际上,全连接层也可以被视为是一种极端情况的卷积层,其卷积核尺寸就是输入矩阵尺寸,因此输出矩阵的高度和宽度尺寸都是1。

FLOPS的计算:(kernel_size^2+1)*num_output*输出规模(下层输入边长乘积)

参看:https://blog.csdn.net/qq_15192373/article/details/78536107?locationNum=5&fps=1

 

5.实例讲解

# 把你的网络贴到这里
# 然后按下 Shift+Enter 即可看到可视化视图.name: "AlexNet"
layer {
  name: "data"
  type: "Input"        
  top: "data"        
  input_param { 
      shape: { 
          dim: 10   #把样本分成10份输入
        dim: 3       #通道数一般为3
        dim: 227  #图像的长和宽
        dim: 227 
    } 
  }
}
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1            #权值的学习率
    decay_mult: 1        #正则化的权重,防止过拟合
  }
  param {
    lr_mult: 2            #偏置项的学习率,一般是权值学习率的两倍
    decay_mult: 0
  }
  convolution_param {
    num_output: 96        #过滤器(filfter)的个数
    kernel_size: 11        #卷积核大小11*11
    stride: 4            #卷积核的步长
  }
}
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "conv1"
  top: "conv1"
}
layer {
  name: "norm1"
  type: "LRN"        #LRN层,此层是对一个输入的局部区域进行归一化,达                        到“侧抑制”的效果。
  bottom: "conv1"    
  top: "norm1"
  lrn_param {
    local_size: 5    #通道数
    alpha: 0.0001    #归一化参数
    beta: 0.75        #归一化参数
  }
}
layer {
  name: "pool1"
  type: "Pooling"    #池化层,为了减少运算量和数据维度而设置的一种层
  bottom: "norm1"
  top: "pool1"
  pooling_param {
    pool: MAX        #pool池化方法,默认为MAX。目前可用的方法有MAX,                     AVE, 或STOCHASTIC
    kernel_size: 3
    stride: 2        #池化的步长,默认为1。一般我们设置为2,即不重叠                    (步长=窗口大小)。
  }
}
layer {
  name: "conv2"
  type: "Convolution"
  bottom: "pool1"
  top: "conv2"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  convolution_param {
    num_output: 256
    pad: 2        #pad扩充边缘,默认为0,不扩充。2两边都加2个像素
    kernel_size: 5
    group: 2    #分组
  }
}
layer {
  name: "relu2"
  type: "ReLU"
  bottom: "conv2"
  top: "conv2"
}
layer {
  name: "norm2"
  type: "LRN"
  bottom: "conv2"
  top: "norm2"
  lrn_param {
    local_size: 5
    alpha: 0.0001
    beta: 0.75
  }
}
layer {
  name: "pool2"
  type: "Pooling"
  bottom: "norm2"
  top: "pool2"
  pooling_param {
    pool: MAX
    kernel_size: 3
    stride: 2
  }
}
layer {
  name: "conv3"
  type: "Convolution"
  bottom: "pool2"
  top: "conv3"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  convolution_param {
    num_output: 384
    pad: 1
    kernel_size: 3
  }
}
layer {
  name: "relu3"
  type: "ReLU"
  bottom: "conv3"
  top: "conv3"
}
layer {
  name: "conv4"
  type: "Convolution"
  bottom: "conv3"
  top: "conv4"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  convolution_param {
    num_output: 384
    pad: 1
    kernel_size: 3
    group: 2
  }
}
layer {
  name: "relu4"
  type: "ReLU"
  bottom: "conv4"
  top: "conv4"
}
layer {
  name: "conv5"
  type: "Convolution"
  bottom: "conv4"
  top: "conv5"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  convolution_param {
    num_output: 256
    pad: 1
    kernel_size: 3
    group: 2
  }
}
layer {
  name: "relu5"
  type: "ReLU"
  bottom: "conv5"
  top: "conv5"
}
layer {
  name: "pool5"
  type: "Pooling"
  bottom: "conv5"
  top: "pool5"
  pooling_param {
    pool: MAX
    kernel_size: 3
    stride: 2
  }
}
layer {
  name: "fc6"
  type: "InnerProduct"
  bottom: "pool5"
  top: "fc6"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  inner_product_param {
    num_output: 4096
  }
}
layer {
  name: "relu6"
  type: "ReLU"
  bottom: "fc6"
  top: "fc6"
}
layer {
  name: "drop6"
  type: "Dropout"
  bottom: "fc6"
  top: "fc6"
  dropout_param {
    dropout_ratio: 0.5  #Dropout是一个防止过拟合的trick。可以随机让                        网络某些隐含层节点的权重不工作。
                        #一般的dropout_ratio 绝对不能超过0.7, 最佳                            的是在0.5以下
                        #dropout_ratio越大舍弃的信息越多,loss下降                            的越慢,准确率增加的越慢
  }
}
layer {
  name: "fc7"
  type: "InnerProduct"
  bottom: "fc6"
  top: "fc7"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  inner_product_param {
    num_output: 4096
  }
}
layer {
  name: "relu7"
  type: "ReLU"
  bottom: "fc7"
  top: "fc7"
}
layer {
  name: "drop7"
  type: "Dropout"
  bottom: "fc7"
  top: "fc7"
  dropout_param {
    dropout_ratio: 0.5
  }
}
layer {
  name: "fc8"
  type: "InnerProduct"
  bottom: "fc7"
  top: "fc8"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  inner_product_param {
    num_output: 1000
  }
}
layer {
  name: "prob"
  type: "Softmax"
  bottom: "fc8"
  top: "prob"
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值