zoukankan      html  css  js  c++  java
  • Convolution Layer:卷积层

    1. 卷积层(Convolution Layer):由若干个卷积核f(filter)和偏移值b组成,(这里的卷积核相当于权值矩阵),卷积核与输入图片进行点积和累加可以得到一张feature map。

    卷积层的特征:

    (1)网络局部连接:卷积核每一次仅作用于图片的局部

    (2)卷积核权值共享:一个卷积层可以有多个不同的卷积核,每一个filter在与输入矩阵进行点积操作的过程中,其权值是固定不变的。

    2. 卷积核(filter):用于提取图片的局部特征,不同的卷积核提取图片特征的效果不同。

    感受野:卷积核的大小 / 范围,卷积核所能感知的区域

      

    一个卷积层可以有若干个卷积核,卷积核的通道数=输入图片的通道数,每一个卷积核的通道与图片的对应通道进行点积+累加的操作,可以得到1个featrue map,假设有3个通道,那么可以得到3个featrue map,然后把这3个feature map对应的位置相加,即可得到1张featrue map,得到的这一张就是该卷积核与图片进行卷积操作的feature map。一般图片有3个通道,red、green、bule,然后卷积核的通道数为3,分别对应r、g、b,然后这对应的三个通道分别点积+累加,得到3个feature map,最后再把这3张feature ma相加,然后再加上偏移值b,就可以得到1张feature map。

    3. 卷积层的运行:

    ①输入:输入是一张图片,图片:宽w,高h,通道数c,由c个w列h行的矩阵构成。输入矩阵的通道数=卷积核的通道数

    ②计算:根据padding(填充)、stride(步长),从图片的左上角开始,假设有3个通道,卷积核的对应通道与输入图片的对应通道进行点积和累加的操作,得到1张feature map,然后把3张feature map的对应位置和偏移矩阵b的对应位置相加,即可得到该卷积核对应的feature map。有多少个卷积核,就有多少个featrue map。n个卷积核经过卷积计算,得到n张featrue map。即,1张feature map中的每一个元素,是由对应的filter的不同维度的矩阵,作用于相应维度输入矩阵的不同位置,进行点积运算和累加,再加上偏移量bias的结果。

    ③输出:有n个卷积核,输出n张feature map,也就是n个矩阵

    △padding:填充,在输入矩阵的四周补0

    n=5,padding=1:

    △stride:步长,进行卷积运算时,filter在输入矩阵上移动,进行点积运算,移动的步长

    n=5,stride=2:

    输入矩阵:32*32*3;卷积核:5*5*3

    有6个卷积核,就有6个feature map

    4. 卷积层输出矩阵的维度:

    ①通道数 = 卷积核的个数 :k个卷积核有k个feature map,输出矩阵的通道数 / 深度为k

    ②高度 / 宽度= (图片的高度or宽度  + 2*padding - 卷积核的高度or宽度)/ 步长 +1

    一般图片的高度宽度是一样的,卷积核的高度宽度也是一样的,设图片的高度/宽度=n,卷积核的高度/宽度=f,填充padding,步长s:

    h_new or w_new =(N + 2 * padding - f)/ s +1

      

    padding=0的情况

    输入:32*32*3    卷积核个数:10     卷积核:5*5*3     pading=2    stride=1 

     

    常见的设置值:

    5. 代码:

    • 输入 x:[batch, height, width, in_channel]
    • 权重 w:[height, width, in_channel, out_channel]
    • 输出 y:[batch, height, width, out_channel]
    def conv_layer(x, out_channel, k_size, stride, padding):
        in_channel = x.shape[3].value
        w = tf.Variable(tf.truncated_normal([k_size, k_size, in_channel, out_channel], mean=0, stddev=stddev))
        b = tf.Variable(tf.zeros(out_channel))
        y = tf.nn.conv2d(x, filter=w, strides=[1, stride, stride, 1], padding=padding)
        y = tf.nn.bias_add(y, b)
        y = tf.nn.relu(y)
        return x

    参考:

    https://blog.csdn.net/dcrmg/article/details/79652487

    https://blog.csdn.net/kingroc/article/details/88192878

  • 相关阅读:
    二叉树的遍历
    深度优先遍历和广度优先遍历
    N的阶乘末尾有多少个0
    框架产生的历史
    Ansible--初始ansible
    日积跬步05
    日积跬步04
    日积跬步03
    日积跬步02
    日积跬步01
  • 原文地址:https://www.cnblogs.com/shiliuxinya/p/12242039.html
Copyright © 2011-2022 走看看