卷积神经网络之卷积层理解(持续更新)

Posted 笔写心城

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了卷积神经网络之卷积层理解(持续更新)相关的知识,希望对你有一定的参考价值。

目录

一、初识卷积层

二、图片卷积的过程(以步长为1,无填充情况为例)

 三、卷积的填充

 四、卷积的步长

 五、卷积的输出大小计算

六、卷积的感受野

 七、卷积层的深度


一、初识卷积层

        卷积层是CNN(Convolutional Neural Networks)中的基本网络层,主要用于对图像进行特征提取操作,其卷积核权重是共享权值的,对应的相关概念还包括步长,填充。卷积层在CNN中的作用如下图所示。

二、图片卷积的过程(以步长为1,无填充情况为例)

        对于输入图片数据的矩阵大小为5X5,卷积核大小为3X3的部分卷积过程如下所示:

         推广到任意大小输入(Input)和任意大小卷积核(Kernel)的卷积过程如下图所示:

 三、卷积的填充

        3.1 填充的作用
        (1)使卷积后图像分辨率不变,方便计算特征图尺寸的变化
        (2)弥补边界信息“丢失” 

        3.2 填充的基本过程
        填充(padding)是指在输入高和宽的两侧填充元素(通常是0元素)。下图我们在原输入高和宽的两侧分别添加了值为0的元素,使得输入高和宽从3变成了5,并导致输出高和宽由2增加到4。下图阴影部分为第一个输出元素及其计算所使用的输入和核数组元素:0×0+0×1+0×2+0×3=0。

 四、卷积的步长

        卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。我们将每次滑动的行数和列数称为步幅或步长(stride)。

        下图展示了在高上步幅为3、在宽上步幅为2的卷积运算。可以看到,输出第一列第二个元素时,卷积窗口向下滑动了3行,而在输出第一行第二个元素时卷积窗口向右滑动了2列。当卷积窗口在输入上再向右滑动2列时,由于输入元素无法填满窗口,无结果输出。下图阴影部分为输出元素及其计算所使用的输入和核数组元素:0×0+0×1+1×2+2×3=8、0×0+6×1+0×2+0×3=6。

 五、卷积的输出大小计算

        5.1 计算公式

        在前面,已经把卷积涉及的主要概念和基本过程介绍了,接下来我们将介绍卷积输入和输出的计算关系。以二维卷积为例。
        输入:大小为的输入矩阵X
        卷积核:大小为的卷积核矩阵K
        输入填充大小:在输入的高上填充,在输入的宽上填充
        卷积核窗口滑动步长:每次计算卷积,在输入矩阵X的高上滑动h个单位,在X的宽上                                                          上滑动w个单位

        设输出,经过卷积后,输出矩阵Y的大小的计算公式如下:

        该公式适合卷积的三种模式:full, same, valid,动态过程参考:http://t.csdn.cn/qO68l

        5.2 计算示例

         (1)示例:下图大小为3x4的输入矩阵经过大小为2x2的卷积核后,得到2x3大小的输出矩阵

         1.输出矩阵大小计算过程为:

         2. 代码实现及output

import torch.nn as nn
import torch


# 定义一个函数来计算卷积层大小。它对输入和输出做相应的升维和降维
def comp_conv2d(conv2d, X):
    # (1, 1)代表批量大小和通道数
    X = X.view((1, 1) + X.shape)
    Y = conv2d(X)
    return Y.view(Y.shape[2:]) # 排除不关心的前两维:批量和通道


#创建大小为3x4的输入矩阵
X = torch.rand(3, 4)


# 卷积核为2x2, 在输入的高和宽上填充大小为(0, 0), 卷积核在高和宽上的滑动步幅为(1, 1)
conv2d = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=(2, 2), padding=(0, 0), stride=(1, 1))   #此处的Conv2d是nn的内置函数,实现卷积过程,返回值请自行查阅
print(comp_conv2d(conv2d, X).shape)


output: torch.Size([2, 3])

        (2)示例: 原大小为3x3的输入矩阵,大小为2x2的卷积核,将输入矩阵的高和宽填充成5x5,每次卷积核窗口在输入矩阵上高的滑动单位为3,宽的滑动单位为2,经过卷积过程后,最后得到大小为2x2的输出矩阵。

import torch.nn as nn
import torch

#忽略警告
import warnings
warnings.filterwarnings("ignore")


# 定义一个函数来计算卷积层大小。它对输入和输出做相应的升维和降维
def comp_conv2d(conv2d, X):
    # (1, 1)代表批量大小和通道数
    X = X.view((1, 1) + X.shape)
    Y = conv2d(X)
    return Y.view(Y.shape[2:]) # 排除不关心的前两维:批量和通道

#创建大小为3x3的输入矩阵
X = torch.range(0, 8).reshape(3, 3)


# # 使用高为2、宽为2的卷积核。在⾼和宽两侧的填充数分别为1和1
conv2d = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=(2, 2), padding=(1, 1), stride=(3, 2))   #此处的Conv2d是nn的内置函数,实现卷积过程,返回值请自行查阅
print(comp_conv2d(conv2d, X).shape)

output: torch.Size([2, 2])

六、卷积的感受野

        卷积神经网络每一层输出的特征图(featuremap)上的像素点在输 入图片上映射的区域大小,即特征图上的一个点对应输入图上的区域。感受野的大小计算,采用从后往前逐层的计算方法。

 七、卷积层的深度

        一个卷积层通常包含多个尺寸一致的卷积核,如下图所示。

以上是关于卷积神经网络之卷积层理解(持续更新)的主要内容,如果未能解决你的问题,请参考以下文章

卷积层里的填充Padding和步幅Stride 动手学深度学习v2 pytorch

读书报告--04神经网络基础学习

深度学习入门-1透彻理解卷积的三层含义:从“卷积”到“图像卷积操作”再到“卷积神经网络”的含义(学习笔记)

卷积可分离卷积转置卷积(反卷积)

动手学pytorch-卷积神经网络基础

深度卷积神经网络池化层为什么使用卷积残差网络