精华内容
下载资源
问答
  • 卷积层池化层

    万次阅读 多人点赞 2018-08-04 16:08:16
    卷积神经网络(Convolutional Neural Layer, CNN),除了全连接层以外(有时候也不含全连接层,因为出现了Global average pooling),还包含了卷积层和池化层卷积层用来提取特征,而池化层可以减少参数数量。 ...

    构建了最简单的网络之后,是时候再加上卷积和池化了。这篇,虽然我还没开始构思,但我知道,一定是很长的文章。

    卷积神经网络(Convolutional Neural Layer, CNN),除了全连接层以外(有时候也不含全连接层,因为出现了Global average pooling),还包含了卷积层和池化层。卷积层用来提取特征,而池化层可以减少参数数量。

    卷积层

    先谈一下卷积层的工作原理。

    我们是使用卷积核来提取特征的,卷积核可以说是一个矩阵。假如我们设置一个卷积核为3*3的矩阵,而我们图片为一个分辨率5*5的图片。那么卷积核的任务就如下所示:

    从左上角开始,卷积核就对应着数据的3*3的矩阵范围,然后相乘再相加得出一个值。按照这种顺序,每隔一个像素就操作一次,我们就可以得出9个值。这九个值形成的矩阵被我们称作激活映射(Activation map)。这就是我们的卷积层工作原理。也可以参考下面一个gif:
    其中,卷积核为

    101010101 1 0 1 0 1 0 1 0 1

    其实我们平时举例的卷积核已经被翻转180度一次了,主要是因为计算过程的原因。详细不用了解,但原理都一样。

    但其实我们输入的图像一般为三维,即含有R、G、B三个通道。但其实经过一个卷积核之后,三维会变成一维。它在一整个屏幕滑动的时候,其实会把三个通道的值都累加起来,最终只是输出一个一维矩阵。而多个卷积核(一个卷积层的卷积核数目是自己确定的)滑动之后形成的Activation Map堆叠起来,再经过一个激活函数就是一个卷积层的输出了。

    卷积层还有另外两个很重要的参数:步长和padding。

    所谓的步长就是控制卷积核移动的距离。在上面的例子看到,卷积核都是隔着一个像素进行映射的,那么我们也可以让它隔着两个、三个,而这个距离被我们称作步长。

    而padding就是我们对数据做的操作。一般有两种,一种是不进行操作,一种是补0使得卷积后的激活映射尺寸不变。上面我们可以看到5*5*3的数据被3*3的卷积核卷积后的映射图,形状为3*3,即形状与一开始的数据不同。有时候为了规避这个变化,我们使用“补0”的方法——即在数据的外层补上0。

    下面是示意图:

    步长2
    步长为2 (图片来自于机器之心
    补0
    补0的变化 (图片来自于机器之心

    了解卷积发展史的人都应该知道,卷积神经网络应用最开始出现是LeCun(名字真的很像中国人)在识别手写数字创建的LeNet-5。

    LeNet-5

    后面爆发是因为AlexNet在ImageNet比赛中拔得头筹,硬生生把误差变成去年的一半。从此卷积网络就成了AI的大热点,一大堆论文和网络不断地发挥它的潜能,而它的黑盒性也不断被人解释。

    能否对卷积神经网络工作原理做一个直观的解释? - Owl of Minerva的回答 - 知乎里面通过我们对图像进行平滑的操作进而解释了卷积核如何读取特征的。

    我们需要先明确一点,实验告诉我们人类视觉是先对图像边缘开始敏感的。在我的理解中,它就是说我们对现有事物的印象是我们先通过提取边界的特征,然后逐渐的完善再进行组装而成的。而我们的卷积层很好的做到了这一点。

    这是两个不同的卷积核滑动整个图像后出来的效果,可以看出,经过卷积之后图像的边界变得更加直观。我们也可以来看下VGG-16网络第一层卷积提取到的特征:

    VGG-16

    由此来看,我们也知道为什么我们不能只要一个卷积核。在我的理解下,假使我们只有一个卷积核,那我们或许只能提取到一个边界。但假如我们有许多的卷积核检测不同的边界,不同的边界又构成不同的物体,这就是我们怎么从视觉图像检测物体的凭据了。所以,深度学习的“深”不仅仅是代表网络,也代表我们能检测的物体的深度。即越深,提取的特征也就越多。

    Google提出了一个项目叫Deepdream,里面通过梯度上升、反卷积形象的告诉我们一个网络究竟想要识别什么。之前权重更新我们讲过梯度下降,而梯度上升便是计算卷积核对输入的噪声的梯度,然后沿着上升的方向调整我们的输入。详细的以后再讲,但得出的图像能够使得这个卷积核被激活,也就是说得到一个较好的值。所以这个图像也就是我们卷积核所认为的最规范的图像(有点吓人):

    Deepdream
    其实这鹅看着还不错,有点像孔雀。

    池化层 (pooling layer)

    前面说到池化层是降低参数,而降低参数的方法当然也只有删除参数了。

    一般我们有最大池化和平均池化,而最大池化就我认识来说是相对多的。需要注意的是,池化层一般放在卷积层后面。所以池化层池化的是卷积层的输出!

    扫描的顺序跟卷积一样,都是从左上角开始然后根据你设置的步长逐步扫描全局。有些人会很好奇最大池化的时候你怎么知道哪个是最大值,emmm,其实我也考虑过这个问题。CS2131n里面我记得是说会提前记录最大值保存在一个矩阵中,然后根据那个矩阵来提取最大值。

    至于要深入到计算过程与否,应该是没有必要的。所以我也没去查证过程。而且给的都是示例图,其实具体的计算过程应该也是不同的,但效果我们可以知道就好了。

    至于为什么选择最大池化,应该是为了提取最明显的特征,所以选用的最大池化。平均池化呢,就是顾及每一个像素,所以选择将所有的像素值都相加然后再平均。

    池化层也有padding的选项。但都是跟卷积层一样的,在外围补0,然后再池化。

    代码解析
    import tensorflow as tf
    import numpy as np
    from tensorflow.examples.tutorials.mnist import input_data
    
    mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
    summary_dir = './summary'
    #批次
    batch_size = 100
    
    n_batch = mnist.train.num_examples // batch_size
    
    x = tf.placeholder(tf.float32, [None, 784], name='input')
    y = tf.placeholder(tf.float32, [None, 10], name='label')
    
    def net(input_tensor):
        conv_weights = tf.get_variable('weight', [3, 3, 1, 32],
                                        initializer=tf.truncated_normal_initializer(stddev=0.1))
        conv_biases = tf.get_variable('biase', [32], initializer=tf.constant_initializer(0.0))
    
        conv = tf.nn.conv2d(input_tensor, conv_weights, strides=[1, 1, 1, 1], padding='SAME')
        relu = tf.nn.relu(tf.nn.bias_add(conv, conv_biases))
    
        pool = tf.nn.max_pool(relu, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='SAME')
    
        pool_shape = pool.get_shape().as_list()
        nodes = pool_shape[1] * pool_shape[2] * pool_shape[3]
        pool_reshaped = tf.reshape(pool, [-1, nodes])
    
        W = tf.Variable(tf.zeros([nodes, 10]), name='weight')
        b = tf.Variable(tf.zeros([10]), name='bias')
        fc = tf.nn.softmax(tf.matmul(pool_reshaped, W) + b)
    
        return fc
    
    reshaped = tf.reshape(x, (-1, 28, 28, 1))
    prediction = net(reshaped)
    loss_ = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=tf.argmax(y, 1), logits=prediction, name='loss')
    loss = tf.reduce_mean(loss_)
    
    train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
    
    correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(prediction, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32), name='accuracy')
    
    init = tf.global_variables_initializer()
    
    with tf.Session() as sess:
        sess.run(init)
        for epoch in range(31):
            for batch in range(n_batch):
                batch_xs, batch_ys = mnist.train.next_batch(batch_size)
                sess.run(train_step, feed_dict={x: batch_xs, y: batch_ys})
            acc = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels})
            print('Iter' + str(epoch) + ",Testing Accuracy" + str(acc))

    这相对于我第一个只用全连接的网络只多了一个net函数,还有因为卷积层的关系进来的数据x需要改变形状。只讲这两部分:

    reshaped = tf.reshape(x, (-1, 28, 28, 1))
    prediction = net(reshaped)

    由于我们feedict上面是,feed_dict={x: mnist.test.images, y: mnist.test.labels},而这样子调用tensorflow的句子我们得到的x固定的形状。因此我们应用tf.reshape(x_need_reshaped,object_shape)来得到需要的形状。

    其中的 1 − 1 表示拉平,不能用None,是固定的。

    conv_weights = tf.get_variable('weight', [3, 3, 1, 32],
                                        initializer=tf.truncated_normal_initializer(stddev=0.1))
    conv_biases = tf.get_variable('biase', [32], initializer=tf.constant_initializer(0.0))
    
    conv = tf.nn.conv2d(input_tensor, conv_weights, strides=[1, 1, 1, 1], padding='SAME')
    relu = tf.nn.relu(tf.nn.bias_add(conv, conv_biases))
    
    pool = tf.nn.max_pool(relu, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding='SAME')

    大部分都是应用内置的函数,来初始化weight(就是卷积核)和biases(偏置项)。偏置项我们没有提到,但其实就是多了一个参数来调控,因此我们讲卷积层的时候也没怎么讲。按照代码就是出来Activation Map之后再分别加上bias。池化也是用到了最大池化。

    注意一下relu。它也是一个激活函数,作用可以说跟之前讲的softmax一样,不过它在卷积层用的比较多,而且也是公认的比较好的激活函数。它的变体有很多。有兴趣大家可以自己去查阅资料。以后才会写有关这方面的文章。

        pool_shape = pool.get_shape().as_list()
        nodes = pool_shape[1] * pool_shape[2] * pool_shape[3]
        pool_reshaped = tf.reshape(pool, [-1, nodes])
    
        W = tf.Variable(tf.zeros([nodes, 10]), name='weight')

    池化层的输出我们并不知道它是如何的形状(当然,你也可以动手算)。因此就算把池化层拉成一维的矩阵,我们也不知道W需要如何的形状。因此,我们查看pool(即池化层的输出)的形状,我暗地里print了一下为[None, 14, 14, 32],因此pool拉平后,就是[None, 14*14*32, 10]。为了接下来进行全连接层的计算,我们的W的形状也应该为[14*14*32, 10]。这段代码的原理就是如此。

    准确率也一样取后15次:

    结果

    emmm, 不用跟之前比了,明显比以前好很多了。下一章决定总结一下,优化的方法好了。

    参考
    https://mlnotebook.github.io/post/CNN1/(可惜是全英)
    能否对卷积神经网络工作原理做一个直观的解释? - Owl of Minerva的回答 - 知乎
    CS231n

    展开全文
  • 卷积层用于进行特征提取。 池化层用于输入的特征图进行压缩,使特征图变小,简化网络计算复杂度或进行特征压缩,提取主要特征。 但在神经网络中它们会使输入的特征逐步变化成什么样?最终得到正确的结果呢?下面我们...

    1.前言:

    我们知道:
    卷积层用于进行特征提取。
    池化层用于输入的特征图进行压缩,使特征图变小,简化网络计算复杂度或进行特征压缩,提取主要特征。
    但在神经网络中它们会使输入的特征逐步变化成什么样?最终得到正确的结果呢?下面我们通过一个简单的神经网络来探究它们的作用。

    2.相关说明:

    这里将使用下图所示的卷积神经网络:
    在这里插入图片描述
    卷积核大小:[1,1,1,1] 分别对应 [batch,height,width,channels],步长:1,填充类型:SAME
    池化窗口(滤波器)大小:[1,2,2,1] 分别对应 [batch,height,width,channels], 步长:2x2, 填充类型:SAME
    实现方式:python tensorflow (现在pytorch似乎也挺火的,感兴趣的也可以用其实现)
    实验数据:MNIST数据集 或 Fashion_MNIST数据集(推荐使用Fashion_MNIST数据集,效果更明显)
    Fashion_MNIST数据集下载地址https://github.com/zalandoresearch/fashion-mnist
    实验数据使用方式见:MNIST数据集使用详解 (MNIST数据集 和 Fashion_MNIST数据集的使用方式都是相同的,相同的代码只需要调换数据集文件就能完美使用)

    3.参考代码及详解:

    import tensorflow as tf
    from tensorflow.examples.tutorials.mnist import input_data
    import matplotlib.pyplot as plt
    import cv2
    mnist_data_folder="/Fashion_MNIST"
    mnist=input_data.read_data_sets(mnist_data_folder,one_hot=True)
    
    
    #创建两个占位符,x为输入网络的图像,y_为输入网络的图像类别
    x = tf.placeholder("float", shape=[None, 784])
    y_ = tf.placeholder("float", shape=[None, 10])
    
    #权重初始化函数
    def weight_variable(shape):
        #输出服从截尾正态分布的随机值
        initial = tf.truncated_normal(shape, stddev=0.1)
        return tf.Variable(initial)
    
    #偏置初始化函数
    def bias_variable(shape):
        initial = tf.constant(0.1, shape=shape)
        return tf.Variable(initial)
    
    #创建卷积op
    #x 是一个4维张量,shape为[batch,height,width,channels]
    #卷积核移动步长为1。填充类型为SAME,可以不丢弃任何像素点
    def conv2d(x, W):
        return tf.nn.conv2d(x, W, strides=[1,1,1,1], padding="SAME")
    
    #创建池化op
    #采用最大池化,也就是取窗口中的最大值作为结果
    #x 是一个4维张量,shape为[batch,height,width,channels]
    #ksize表示pool窗口大小为2x2,也就是高2,宽2
    #strides,表示在height和width维度上的步长都为2
    def max_pool_2x2(x):
        return tf.nn.max_pool(x, ksize=[1,2,2,1],
                              strides=[1,2,2,1], padding="SAME")
    
    #第1层,卷积层
    #初始化W为[5,5,1,32]的张量,表示卷积核大小为5*5,第一层网络的输入和输出神经元个数分别为1和32
    W_conv1 = weight_variable([5,5,1,32])
    #初始化b为[32],即输出大小
    b_conv1 = bias_variable([32])
    
    #把输入x(二维张量,shape为[batch, 784])变成4d的x_image,x_image的shape应该是[batch,28,28,1]
    #-1表示自动推测这个维度的size
    x_image = tf.reshape(x, [-1,28,28,1])
    
    #把x_image和权重进行卷积,加上偏置项,然后应用ReLU激活函数,最后进行max_pooling
    #h_pool1的输出即为第一层网络输出,shape为[batch,14,14,1]
    h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
    h_pool1 = max_pool_2x2(h_conv1)
    
    #第2层,卷积层
    #卷积核大小依然是5*5,这层的输入和输出神经元个数为32和64
    W_conv2 = weight_variable([5,5,32,64])
    b_conv2 = weight_variable([64])
    
    #h_pool2即为第二层网络输出,shape为[batch,7,7,1]
    h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
    h_pool2 = max_pool_2x2(h_conv2)
    
    #第3层, 全连接层
    #这层是拥有1024个神经元的全连接层
    #W的第1维size为7*7*64,7*7是h_pool2输出的size,64是第2层输出神经元个数
    W_fc1 = weight_variable([7*7*64, 1024])
    b_fc1 = bias_variable([1024])
    
    #计算前需要把第2层的输出reshape成[batch, 7*7*64]的张量
    h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
    
    #Dropout层
    #为了减少过拟合,在输出层前加入dropout
    keep_prob = tf.placeholder("float")
    h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
    
    #输出层
    #最后,添加一个softmax层
    #可以理解为另一个全连接层,只不过输出时使用softmax将网络输出值转换成了概率
    W_fc2 = weight_variable([1024, 10])
    b_fc2 = bias_variable([10])
    
    y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
    
    #预测值和真实值之间的交叉墒
    cross_entropy = -tf.reduce_sum(y_ * tf.log(y_conv))
    
    #train op, 使用ADAM优化器来做梯度下降。学习率为0.0001
    train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
    
    #评估模型,tf.argmax能给出某个tensor对象在某一维上数据最大值的索引。
    #因为标签是由0,1组成了one-hot vector,返回的索引就是数值为1的位置
    correct_predict = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
    
    #计算正确预测项的比例,因为tf.equal返回的是布尔值,
    #使用tf.cast把布尔值转换成浮点数,然后用tf.reduce_mean求平均值
    accuracy = tf.reduce_mean(tf.cast(correct_predict, "float"))
    
    #也可以批量导入训练,注意使用mnist.train.next_batch(batch_size),得到的批次数据每次都会自动随机抽取这个批次大小的数据
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer()) #初始化变量
        for i in range(2000):  #开始训练模型,循环2000次,每次传入一个批次的图像
            batch_size = 1  # 每次批量训练1幅图像
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)  # 随机抓取训练数据中的1个批处理数据点
            #print(batch_xs)    #打印该图像列表
            #print(batch_ys)    #打印该图像标签
            sess.run(train_step,feed_dict={x:batch_xs, y_:batch_ys, keep_prob:0.5})
    
        batch =1  # 每次批量测试1幅图像,可以设置多一点,算正确率
        test_xs, test_ys = mnist.test.next_batch(batch)
        print(test_xs.shape)
    
        plt.figure()
        im = test_xs.reshape(28, 28)  # 从训练数据集中随机取的一张图,将其转化为28x28格式
        # im=batch_xs[i].reshape(28,28)	#该批次的第i张图
        plt.imshow(im,cmap='gray')
        plt.pause(0.1)  # 暂停时间
    
        result=(sess.run([h_conv1,h_pool1,h_conv2,h_pool2,y_conv,], feed_dict={x: test_xs, y_: test_ys, keep_prob: 1.0}))
    
        print(result[0].shape)
        plt.matshow(result[0][0,:,:,0], cmap=plt.get_cmap('gray'))
        #a = result[0][0].reshape((32, 28, 28))
        #plt.imshow(a[0],cmap='gray')
        plt.pause(0.1)  # 暂停时间
    
        print(result[1].shape)
        #b = result[1][0].reshape((32, 14, 14))
        plt.matshow(result[1][0, :, :, 0], cmap=plt.get_cmap('gray'))
        plt.savefig("1.jpg")
        #plt.imshow(b[0], cmap='gray')
        plt.pause(0.1)  # 暂停时间
    
        print(result[2].shape)
        plt.matshow(result[2][0, :, :, 0], cmap=plt.get_cmap('gray'))
        #plt.imshow(c[0], cmap='gray')
        plt.pause(0.1)  # 暂停时间
    
        print(result[3].shape)
        plt.matshow(result[3][0, :, :, 0], cmap=plt.get_cmap('gray'))
        #plt.imshow(d[0], cmap='gray')
        plt.pause(0.1)  # 暂停时间
    
        print(result[4])
        plt.show()
    
    
    

    运行结果说明:
    在这里插入图片描述
    我们可以看到预测的概率为:
    [[3.0097897e-05 3.6264613e-05 1.6801963e-04 7.7600002e-05 3.7330945e-05
    3.6119664e-04 1.0586195e-03 5.9116323e-05 6.3654697e-05 9.9810815e-01]]
    其分别对应官方给出的标签图(翻译是Google的错,嗯):
    在这里插入图片描述
    很明显,结果中最大值所表明的标签值是9,神经网络的预测结果是正确的,接下来,我们在来看看图片特征经过每个卷积和池化层都发生了什么。

    原图:
    在这里插入图片描述
    这里我们可以看出它是什么,还有它的大小是:28x28

    特征图1:
    在这里插入图片描述
    我们可以看出它的大小对于原图是没有发生变化的,这对应了卷积核的填充方式“SAME”,和步长1,其不会改变输出图片大小。
    第一层卷积层似乎提取了其边缘的特征。(这只是该神经网络认为的特征,有时其实我们并不能明确看出它把什么作为了特征)

    特征图2:
    在这里插入图片描述
    我们可以看出它的大小是14x14,这对应了2x2的池化核和2x2的步长,另外需要说明的是池化层总是会使图片缩小(或大小不变,但这是没有意义的,相当于池化层没有做任何事)。
    第二层池化层似乎将特征图进行压缩,使特征图变小,使边缘特征更加明显化。

    特征图3:
    在这里插入图片描述
    我们可以看出卷积层没有改变由池化层得到的特征大小。
    第三层卷积层认为其特征边缘为,顶部的那一横,中间的一竖,左下角的一个弧形,以及右下角的一个点。

    特征图4:
    在这里插入图片描述
    我们可以看到池化层使图片缩小,进行特征压缩,得到了如上特征。
    而在后面全连接层中,会将该特征归类。

    或许这样的解释很模糊,但是我们可以将不同类别所得到的特征图进行对比,活血可以看出提取了什么不同的特征(下面只展示相应特征图四,并且只针对与正确的结果)。
    原图:
    在这里插入图片描述
    体恤的特征图4:
    在这里插入图片描述
    凉鞋的特征图4:
    在这里插入图片描述
    裤子的特征图4:
    在这里插入图片描述
    好了,不弄了,对于有的特征图,我们可以猜测出它提取了什么特征(如上例中,明显提取了部分边缘特征),但有些特征图我们并看不出任何东西,但神经网络却得到了正确的分类,至于神经网络为什么能完成这样的操作,至今还没有较为合理的科学解释,但它就是那种,很神秘很酷的那种(还很令人头秃)。

    其它说明:

    1.由各层得到的矩阵(也就是特征图直接打印出来的话,你什么也看不出来,那是没有经过排序的),请注意代码中是如何打印出各个特征图!
    2.请注意该数据集的使用许可:
    在这里插入图片描述
    3.有时候得到的特征图可能看不出什么东东,这是正常的(这些图片太小了,而且有的差别不是很大,或者你训练的图片不够多),你可以多尝试几次。
    4.如果你有其它建议或想法,欢迎在评论区讨论。

    结论:

    在这里插入图片描述

    展开全文
  • 卷积神经网络——卷积层和池化层

    千次阅读 2020-01-05 10:29:05
    卷积神经网络的概念最早出自科学家提出的感受野,在19世纪60年代科学家通过对猫的视觉皮细胞研究发现,每一个视觉神经元只会处理一小块区域的视觉图像。这明显区别于传统的神经网络,...而且,第一个卷积层会直...

    卷积神经网络的概念最早出自科学家提出的感受野,在19世纪60年代科学家通过对猫的视觉皮层细胞研究发现,每一个视觉神经元只会处理一小块区域的视觉图像。这明显区别于传统的神经网络,传统的神经网络是一种全连接模型,在处理大量数据时,由于这种全连接模型使得模型复杂度大大提升,而且易出现过拟合的现象。
    1.卷积层
    然而在卷积神经网络中,可以利用空间结构关系减少需要学习的参数量,提高算法的训练效率。而且,第一个卷积层会直接接受图像像素级的输入,每一个卷积操作只会处理一小块图像,每经过一次卷积核所得到的新的图像像素都是对原图像最有效的特征提取。
    这里,我们所说的卷积核在卷积神经网络中指的是过滤器。过滤器的输入是一小块区域的视觉图像,输出是单位节点矩阵并且深度不限(深度称为过滤器的深度,指的是输出单位节点矩阵的深度,需要人工指定)。在卷积层中,过滤器所处理的节点矩阵的长和宽都是由人工指定的,节点矩阵的尺寸也称为滤波器的尺寸。通常情况下,节点矩阵都是三维矩阵(当图像是黑白图像时只有一个颜色通道此时为二维矩阵;对于RGB图像,有三个颜色通道,为三维矩阵)。常用的过滤器的尺寸有3×3或者5×5。
    卷积层结构的前向传播过程就是通过将一个过滤器从输入图像的左上角移动至右下角,并且计算每一个对应的单位矩阵得到的。
    我们假设过滤器尺寸为2×2,图像输入节点深度为3,则经过过滤器得到第i个的单位节点矩阵的值为:
    在这里插入图片描述
    a为输入节点矩阵中相应位置处的像素值(f为ReLU函数,通常在神经网络中定义为f=max(0,w^Tx+b))。
    具体计算过程如下:
    在这里插入图片描述
    在这里插入图片描述
    实际上,过滤器是一个二维或者三维的矩阵模板,用于对感受野中的每个通道做特征提取,过滤器的深度即为我们要提取的特征属性的个数,每一个特征属性对应一个feature map。原图像的每一个通道对应过滤器权值矩阵的每个通道,对于输出的单位节点矩阵又对应一个偏置项。通过输入节点矩阵与过滤器对应位置处的权值相乘再求和再加上该输出节点对应的偏置项参数,将结果作为激活函数的自变量,计算得到过滤器的输出,即单位节点矩阵的值。当过滤器的尺寸大小不为1×1时,卷积层前向传播得到的矩阵尺寸要小于当前层矩阵的尺寸。为了避免这种尺寸的变化,我们通过在当前层矩阵的边界处加入全0填充。这样使得卷积层前向传播得到的矩阵大小和当前层矩阵大小保持一致。
    在这里插入图片描述
    在这里插入图片描述
    我们还可以通过设置过滤器移动的步长来调整结果矩阵的大小。当过滤器的尺寸为2×2,并且对输入节点矩阵使用全零填充时,通过过滤器得到的结果矩阵的大小为(若有余数,向上取整):
    在这里插入图片描述
    当过滤器尺寸不为2×2,并且对输入节点矩阵使用全零或者不使用全零填充时,通过过滤器得到的结果矩阵的大小为:

    在这里插入图片描述
    2.池化层
    池化层的作用是降采样,压缩卷积层图像尺寸,保留最显著的特征,一般常用最大池化法和平均池化法。
    与卷积层的过滤器类似,池化层的过滤器也需要人工设定过滤器的尺寸、是否需要使用全零填充以及过滤器移动步长等设置,而且这些设置的意义也是一样的。卷积层和池化层中过滤器移动的方式是相似的,唯一的区别就是卷积层使用的过滤器是横跨整个输入节点矩阵的深度,而池化层使用的过滤器只影响一个深度上的节点。所以池化层的过滤器除了在长和宽两个维度移动,还需要在深度这个维度上移动。下图展示了一个最大池化层前向传播计算过程:
    在这里插入图片描述

    展开全文
  • 假如有一幅1000*1000的图像,如果把整幅图像作为向量,则向量的长度为1000000(10610^6106)。在假如隐含层神经元的个数输入一样,也是1000000;那么,输入层到隐含层的参数...卷积层 激活层 池化层 全连接FC层 ...

    假如有一幅1000*1000的图像,如果把整幅图像作为向量,则向量的长度为1000000( 1 0 6 10^6 106)。在假如隐含层神经元的个数和输入一样,也是1000000;那么,输入层到隐含层的参数数据量有 1 0 12 10^{12} 1012。所以,我们还得降低维数,同时得以整幅图像为输入(人类实在找不到好的特征了)。

    在这里插入图片描述
    CNN网络一共有5个层级结构:

    • 输入层
    • 卷积层
    • 激活层
    • 池化层
    • 全连接FC层

    卷积层

    局部感知:人的大脑识别图片的过程中,并不是一下子整张图同时识别,而是对于图片中的每一个特征首先局部感知,然后更高层次对局部进行综合操作,从而得到全局信息。
    在这里插入图片描述
    卷积层计算方法:
    F 1 = W 11 ⋅ R + W 12 ⋅ G + W 13 ⋅ B + b 1 F 2 = W 21 ⋅ R + W 22 ⋅ G + W 23 ⋅ B + b 2 F 3 = W 31 ⋅ R + W 32 ⋅ G + W 33 ⋅ B + b 3 F 4 = W 41 ⋅ R + W 42 ⋅ G + W 43 ⋅ B + b 4 F_1 = W_{11} \cdot R +W_{12} \cdot G+W_{13} \cdot B+b_1\\ F_2 = W_{21} \cdot R +W_{22} \cdot G+W_{23} \cdot B+b_2\\ F_3 = W_{31} \cdot R +W_{32} \cdot G+W_{33} \cdot B+b_3\\ F_4 = W_{41} \cdot R +W_{42} \cdot G+W_{43} \cdot B+b_4 F1=W11R+W12G+W13B+b1F2=W21R+W22G+W23B+b2F3=W31R+W32G+W33B+b3F4=W41R+W42G+W43B+b4
    其中,F表示每一张特征图,W表示卷积核

    池化层

    池化(Pooling):也称为欠采样或下采样。主要用于特征降维,压缩数据和参数的数量,减小过拟合,同时提高模型的容错性。主要有:

    • Max Pooling:最大池化
    • Average Pooling:平均池化
      在这里插入图片描述
      通过池化层,使得原本44的特征图压缩成了22,从而降低了特征维度。
      在这里插入图片描述
      虽然人不太容易分辨出池化后的特征图,但是没关系,机器还是可以识别的

    输出层(全连接层)

    经过前面若干次卷积+激励+池化后,终于来到了输出层,模型会将学到的一个高质量的特征图片全连接层。其实在全连接层之前,如果神经元数目过大,学习能力强,有可能出现过拟合。因此,可以引入dropout操作,来随机删除神经网络中的部分神经元,来解决此问题。还可以进行局部归一化(LRN)、数据增强等操作,来增加鲁棒性。
      当来到了全连接层之后,可以理解为一个简单的多分类神经网络(如:BP神经网络),通过softmax函数得到最终的输出。整个模型训练完毕。
      两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。也就是跟传统的神经网络神经元的连接方式是一样的:
      在这里插入图片描述

    展开全文
  • 卷积层和池化层有什么区别 卷积层 池化层 功能 提取特征 压缩特征图,提取主要特征 操作 可惜是二维的,对于三维数据比如RGB图像(3通道),卷积核的深度必须同输入的通道数,输出的通道数等于卷积核的...
  • 也就是其他那些层作用就是突出重要信息,降低噪声。 卷积层 ksize 卷积核的大小 strides 卷积核移动的跨度 padding 边缘填充 池化层 import keras from keras import layers layers.Conv2D() layers.MaxPolling...
  • CNN中卷积层池化作用和理解

    千次阅读 2019-12-17 11:34:48
    承接上文对CNN的介绍[学习笔记P20-CNN],下面来看看一些细节梳理: CNN框架: 池化层(pooling layer)也叫做子采样层...卷积层【局部连接权重共享】虽然可以显著减少网络中连接的数量,但特征映射组中的神...
  • 作用和意义: ①局部感知: 在传统神经网络中每个神经元都要与图片上每个像素相连接,这样的话就会造成权重的数量巨大造成网络难以训练。而在含有卷积层的的神经网络中每个神经元的权重个数都是卷积核的大小,这样就...
  • cnn的卷积层和池化层

    千次阅读 2018-03-05 14:37:02
    卷积层和池化层卷积神经网络(CNN)由输入层、卷积层、激活函数、池化层、全连接层组成,即INPUT-CONV-RELU-POOL-FC(1)卷积层:用它来进行特征提取,如下:输入图像是32*32*3,3是它的深度(即R、G、B),卷积层是一...
  • 本博客会持续更新,后面会加入各个部分的代码实现。 前沿 在图像分类以及目标定位等任务中,卷积神经网络已经得到了充分地运用。...注:通常,池化层和激活函数又归类于卷积层。这里为了讲解方便,...
  • 经过一卷积以后,输入的图像尺寸变化不大,只是缩小了卷积核-1。根据相邻数据的相关性,在每个nxn区域内,一般2x2,用一个数代表原来的4个数,这样能把数据缩小4倍,同时又不会损失太多信息。 一副24*24的图像。...
  • 卷积
  • 1. 卷积层作用 卷积层作用是提取输入图片中的信息,这些信息被称为图像特征。 2. 池化层作用 chi'h 3. 全连接层的作用
  • 需要人工设计特征,然后将这些特征计算的值组成特征向量,在过去几十年的经验来看,人工找到的特征并不是怎么好用,特征有时多了(需要PCA降维),特征有时少了(容易过拟合),有时选择的特征根本就不起作用(真正...
  • 卷积层后输出图像的大小:(n-f+2p)/stride 向下取整 例如:若值为4.9 那么取 4 池化层:(n-f+2p)/stride 向上取整
  • 卷积神经网络有卷积层和池化层。包含多个卷积层和池化层卷积层有滤波器的作用。多层卷积层可描述为各级滤波器。获取不同粒度的信息 池化层也称为欠采样或下采样。主要用于特征降维,压缩数据参数的数量,减小过...
  • 李宏毅讲解CNN 卷积层操作图解 池化层操作图解 一次卷积+池化层操作后结果 压平层操作图解 处理实例讲解1 处理实例讲解2 简单实例展示 ...
  • 总结全连接层,卷积层池化层等。。各自的作用

    万次阅读 多人点赞 2018-08-31 08:54:54
    全连接层到底什么用? ... 全连接层(fully connected ...如果说卷积层池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用。在实际使...
  • 其输入通常是一个特征向量,需要人工设计特征,然后将这些特征计算的值组成特征向量,在过去几十年的经验来看,人工找到的特征并不是怎么好用,有时多了,有时少了,有时选择的特征根本就不起作用(真正起作用的特征...
  • 主要介绍了keras中的卷积层&池化层的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • CNN卷积层池化层、全连接层

    万次阅读 多人点赞 2019-03-02 14:25:00
    卷积神经网络是通过神经网络反向传播自动学习的手段,来得到各种有用的卷积核的过程。 卷积神经网络通过卷积和池化操作,自动学习图像在各个层次上...典型的卷积神经网络通常由以下三种结构共同组成:卷积层(Conv...
  • 一、卷积层 ...(3)等变表示: 由于卷积核尺寸可以远远小于输入尺寸,即需要学习的参数的数量,并且针对每个卷积层可以使用多个卷积核获取输入的特征映射,对数据具有很强的特征提取表示能力,并
  • 由于pytorch没有自动计算卷积层和池化层后的图片尺寸,在全连接层Linear中需要自己计算图片尺寸,因此需要记住这几个公式。 卷积层 W:矩阵宽,H:矩阵高。 F:卷积核宽高 P:padding(需要填充的0的个数 N:卷积...
  • 池化层:有MaxPoolAveragePool等。其中MaxPool应用广泛。因为经过MaxPool可以减小卷积核的尺寸,同时又可以保留相应特征,所以主要用来降维。 全连接层:在全连接的过程中丢失位置信息,可以理解为降低了学习过程...
  • TensorFlow卷积层函数(卷积层+池化层)

    千次阅读 2018-05-10 22:34:12
    TensorFlow中卷积神经网络常用的有卷积层和池化层,下面对常用函数的常用参数进行总结:主要是三个函数:import tensorflow as tf tf.nn.conv2d() tf.nn.max_pool() tf.nn.avg_pool()1.tf.nn.conv2d 一般常用的...
  • 深入理解CNN卷积层池化层、全连接层

    万次阅读 多人点赞 2019-01-08 00:53:10
    深入理解CNN卷积层池化层、全连接层 文章目录深入理解CNN卷积层池化层、全连接层卷积层(Convolution)池化层(Pooling)全连接层(Fully connected)全连接层到底什么用?首先三点:接下来再主要谈谈全连接层的意义 ...
  • https://blog.csdn.net/zfjBIT/article/details/88075569 一个很详细的关于卷积层池化层和全连接层的解释
  • 池化层 全连接FC层 1 输入层 与传统神经网络/机器学习一样,模型需要输入的进行预处理操作,常见的输入层中预处理方式有: 去均值 归一化 PCA/SVD降维等 2 卷积层 局部感知:人的大脑识别图片的过程中,并不是一下子...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,633
精华内容 16,653
关键字:

卷积层和池化层的作用