CNN

-------------------------------大纲---------------------------------------------

1 一些常见关键字含义

2 推导

3 一般使用过程

4 tensorflow中具体使用

 

----------------------------------------------------------------------------------

为什么要过度到CNN?

在全连接前馈神经网络中,如果第l层有n个神经元,第l−1层有m个神经元,则连接边有n× m 个,也就是权重矩阵有n×m个参数。当m和n都很大时,权重矩阵的参数非常多,训练的效率会非常低。而在卷积神经网络中,卷积层的神经元只与前一层的部分神经元节点相连,即它的神经元间的连接是非全连接的,且同一层中某些神经元之间的连接的权重 w 和偏移 b 是共享的(即相同的),这样大量地减少了需要训练参数的数量。

1 一些常见关键字含义

1.1卷积

卷积是信号处理中的概念。其定义可以参见如下在图像中使用的公式。

卷积就是取一个窗口filter,这个filter在数据上面不断地滑动,直到覆盖所有样本。形象的描述就是拿一个二维的矩阵(滤波器)去卡每张图片,计算方式是将二维矩阵中的的每个元素和图片矩阵的每个元素相乘然后相加也就是滤波器filter与数据窗口做内积。给出个如下形象的图片。

针对上图举个计算的实例,用右上的filter和左边的数据矩阵的蓝色部分计算的第一个值是0∗0+0∗0+0∗(−1)+0∗1+1∗0+2∗0+0∗0+1∗0+0∗1=0其他的计算同理。
之所以卷积神经网络的参数不会很大,有一个很重要的性质就是参数共享机制:同一个神经元,无论输入数据如何滑动变化,连接数据窗的权重是固定的。这样一来,有多少个神经元,就制定多少组参数,过程中不会再改变。也就是上面红色的框在移动的时候其权值是相同。以下介绍些涉及的参数。
(1) 步长stride:窗口每次滑动的距离,注意包括向上和向下两个方向滑动
(2)填充值zero-padding:在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑倒末尾位置,通俗地讲就是为了总长能被步长整除。
1.2 池化
池化层夹在连续的卷积层中间,用于压缩数据和参数的量、减小过拟合。和卷积类似,也是拿个小框去数据上面去卡,只不过这里是在2X2的窗口中选出其中最大或者最小的元素。池化层有 Max pooling 和 average pooling两种方式,工业界多用Max pooling。Max pooling每次把窗口中最大的值抽出来,如下图:

 

 

 

 

1.3 flatten

在实际使用的时候一般会对输入的数据过多个CNN,最终为了综合使用这些CNN的卷积池化的结果(一般是矩阵),需要将这些矩阵转化为一维的向量,然后再将这多个一维向量首尾相连拼接在一起(一种使用方式)。

1.4 feature map

卷积之后的输出矩阵,可以看成是对原始输入数据的特征选择。

feature map的大小和输入、filter、步长都有直接的关系。网上大多是步长为1的情况,自己总结了个公式。
举个例子,输入是5x5维的tensor,卷积核filter为3x3,步长stride为1的时候
input: 5x5
filter:  3x3
stride: 1x1
最终feature map为:3x3

步长不为1的时候,输入维数又很大的时候,该怎么计算,经过自己的研究得出公式:
input_size: 输入维数大小
filter_size: 卷积核大小
stride: 步长
feature map = (input_size - filter_size + stride) / stride  上取整,边界不丢弃
以上面的例子再算一次
(5-3+1)/1= 3 

2 推导

3 一般使用过程

输入层---n个[卷积 -- 激活 -- 池化]--flatten---cancat---全连接---softmax

4 tensorflow中具体使用

 

#filter_sizes表示不同的卷积窗口
tf.flags.DEFINE_string("filter_sizes", "3,4,5", "Comma-separated filter sizes (default: '3,4,5')")
# num_filters表示针对上面每个大小的卷积窗口有多少个
tf.flags.DEFINE_integer("num_filters", 128, "Number of filters per filter size (default: 128)")
pooled_outputs = []
for i, filter_size in enumerate(filter_sizes):
    with tf.name_scope("conv-maxpool-%s" % filter_size):
        # Convolution Layer
        filter_shape = [filter_size, embedding_size, 1, num_filters]
        W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W")
        b = tf.Variable(tf.constant(0.1, shape=[num_filters]), name="b")
        conv = tf.nn.conv2d(
            self.embedded_chars_expanded,
            W,
            strides=[1, 1, 1, 1],
            padding="VALID",
            name="conv")
        # Apply nonlinearity
        h = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu")
        # Maxpooling over the outputs
        pooled = tf.nn.max_pool(
            h,
            ksize=[1, sequence_length - filter_size + 1, 1, 1],
            strides=[1, 1, 1, 1],
            padding='VALID',
            name="pool")
        pooled_outputs.append(pooled)

# Combine all the pooled features
num_filters_total = num_filters * len(filter_sizes)
self.h_pool = tf.concat(pooled_outputs, 3)
self.h_pool_flat = tf.reshape(self.h_pool, [-1, num_filters_total])卷积时valid还是same

tensorflow中卷积的 padding参数可以设为两个值SAME,VALID

VALID模式如上图所示,对原始图像进行卷积,卷积后的矩阵只有3×3阶,比原来的图片要小了

SAME模式要求卷积后的feature map与输入的矩阵大小相同,因此需要对输入矩阵的外层包裹n层0,然后再按照VALID的卷积方法进行卷积。n的求法如下式:

  • SAME:edge_row = (kernel_row - 1) / 2; edge_cols = (kernel_cols - 1) / 2;
  • VALID:edge_row = edge_cols = 0;

其中,edge_row是包裹0的行数,edge_cols是包裹0的列数 , kernel_row就卷积核的行数

 

相关博客:

CNN文本分类http://blog.csdn.net/diye2008/article/details/53105652?locationNum=11&fps=1

http://blog.csdn.net/u012052268/article/details/77862202

http://blog.sina.com.cn/s/blog_6fd8e1cd0102wu4u.html

http://blog.csdn.net/banana1006034246/article/details/73650397

https://blog.csdn.net/u010089444/article/details/52563213?locationNum=9

https://blog.csdn.net/fontthrone/article/details/76652753

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值