CNN学习笔记与理解

参考吴岸城《神经网络与深度学习》

卷积层的参数及其含义

http://blog.csdn.net/fabulousli/article/details/52886964

 

卷积层:对输入数据应用若干过滤器(高大上的名称就是卷积核),一个输入参数被用来做很多类型的特征提取(《神经网络与深度学习》P118

caffe Convolution层:

就是卷积层,是卷积神经网络(CNN)的核心层。

层类型:Convolution

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

在后面的convolution_param中,我们可以设定卷积层的特有参数。

必须设置的参数:

   num_output:卷积核(filter)的个数

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

其它参数:

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

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

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

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

     bias_term:是否开启偏置项,默认为true,开启

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

输入:n*c0*w0*h0

输出:n*c1*w1*h1

其中,c1就是参数中的num_output,生成的特征图个数

 w1=(w0+2*pad-kernel_size)/stride+1;

 h1=(h0+2*pad-kernel_size)/stride+1;

如果设置stride为1,前后两次卷积部分存在重叠。如果设置pad=(kernel_size-1)/2,则运算后,宽度和高度不变。

Caffe为例:

layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1
  }
  param {
    lr_mult: 2
  }
  convolution_param {
    num_output: 32
    pad: 2
    kernel_size: 5
    stride: 1
    weight_filler {
      type: "gaussian"
      std: 0.0001
    }
    bias_filler {
      type: "constant"
    }
  }
}

问题1那么,上图中的32个卷积核怎么实现的?这么多卷积核的区别在哪儿?

caffe自身随机生成的,

但是这些参数是要经过进一步训练,最终记录在model里面.

问题2:感受野是个嘛?

CNN牛的地方就是在于通过感受区域和权值共享减少神经网络需要训练的参数的个数”(《神经网络与深度学习》P120

感受区域也就是“感受野(receptive field)”https://www.cnblogs.com/objectDetect/p/5947169.html

感受野的定义是卷积神经网络每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小。

 


问题3:权值共享怎么理解?是层与层之间神经元连接的权重Wij都用一个吗?

权值共享一般是在卷积层的说法,也就是采用一个卷积核去扫整个输入图像,进而得到一个feature map。那么卷积核的参数,其实就可以理解为卷积层的权重,这也是需要通过训练来学习的。

其实可以从较少参数的角度去思考权值共享的意义

所谓的权值共享就是说,给一张输入图片,用一个filter去扫这张图,filter里面的数就叫权重,这张图每个位置是被同样的filter扫的,所以权重是一样的,也就是共享。  这么说可能还不太明白,如果你能理解什么叫全连接神经网络的话,那么从一个尽量减少参数个数的角度去理解就可以了。  对于一张输入图片,大小为W*H,如果使用全连接网络,生成一张X*Y的featuremap,需要W*H*X*Y个参数,如果原图长宽是10^2级别的,而且XY大小和WH差不多的话,那么这样一层网络需要的参数个数是10^8~10^12级别。  这么多参数肯定是不行的,那么我们就想办法减少参数的个数对于输出层featuremap上的每一个像素,他与原图片的每一个像素都有连接,每一个链接都需要一个参数。但注意到图像一般都是局部相关的,那么如果输出层的每一个像素只和输入层图片的一个局部相连,那么需要参数的个数就会大大减少。假设输出层每个像素只与输入图片上F*F的一个小方块有连接,也就是说输出层的这个像素值,只是通过原图的这个F*F的小方形中的像素值计算而来,那么对于输出层的每个像素,需要的参数个数就从原来的W*H减小到了F*F。如果对于原图片的每一个F*F的方框都需要计算这样一个输出值,那么需要的参数只是W*H*F*F,如果原图长宽是10^2级别,而F在10以内的话,那么需要的参数的个数只有10^5~10^6级别,相比于原来的10^8~10^12小了很多很多。如果所有输出像素共享一个卷积核F*F,那么参数就只有F*F,进一步减少训练的参数.


问题4CNN的参数个数和连接参数怎么理解?


参见:https://www.jianshu.com/p/ce609f9b5910




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值