前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用 Excel 来阐释什么是多层卷积

用 Excel 来阐释什么是多层卷积

作者头像
AI科技评论
发布2019-08-21 15:17:27
8660
发布2019-08-21 15:17:27
举报
文章被收录于专栏:AI科技评论AI科技评论

原来 Excel 也有这种妙用?!

原标题 | Multi-Channel Convolutions explained with… MS Excel!

作者 | Thom Lane

翻译 | 廖颖、希贝儿•兰姆、Diyz、micah壹路向北、通夜

编辑 | Pita

在之前的系列里,我们讨论了 1D 卷积, 2D 卷积 ,3D 卷积,今天的我们将会讨论 4D 卷积,5D 卷积, 6D卷积…

开玩笑的,我们将会讨论一些更有用的,更容易用Excel 可视化的东西, 首先我们看一下多输入通道中的卷积, 之后会讨论多输出通道的卷积,在MXNET Gluon 中很简单。

多输入通道

目前 在卷积系列中我们已经应用了:

  • 1D 卷积应用 一维数据(时间)
  • 2D 卷积应用 二维数据 (高,宽)
  • 3D 卷积 应用 三维数据 (长 宽 高)

这里 你会看到明显的应用模式,但是在这些简单的通信之间隐藏了一个重要的细节。我们输入的数据通常在每一个位置都定义了多个变量 (通过时间,空间),不仅仅只是一个数值。我们称其为通道。

Conv1D 和多输入通道

来看一个有趣的例子,让我们用冰激凌销售额的预测作为案例。在我们的时间维度上,输入以天为间隔,正态化我们的产品价格,营销话费, 室外温度,是否为周末等数据。总计4个输入通道

图1:一个4通道的输入数组,覆盖了6个时间间隔

尽管输入数据看起来像二维,但只有一个维度是空间的。我们期待从本地相邻阈值中找到模型,而不是跨越本地相邻值的通道变量。从一个随机序列的4个变量开始(A,B,C,D),我们不期待在A&B ,B&C,C&D 之间找到相似的空间关系(如果我们在这个维度上将将核层设为2)。

由于这个原因,在处理多通道时间数据的时候,最好使用1D 卷积, 尽管数据看上去像是二维的。

应用了 1D 卷积之后 (卷积核的大小是3) 我们的卷积核看起来不同于上一篇文章的应用了单个通道的例子。这次我们有4个输入通道,我们的卷积核也会用4个通道初始化。所以尽管我们使用了1D 卷积 但是我们有一个2D 卷积核!一个1D 卷积只代表我们在一个维度上滑动卷积核,但是并没有定义卷积核的形状,因为这也取决于输入通道的形状。

图2:一个 卷积核大小为3 的1D 卷积, 应用于 一个4*6 的输入矩阵,输出一个1*4 的矩阵

图3:单元格Q4使用的Excel公式

进阶:在这种情况下, 一个卷积核形状为(3,4)的2D卷积,达到的效果是相等的,但是对于一个1D 卷积你不用详细列出通道的维度。我们通常依赖于卷积核形状来推断 (例如,在传入第一批数据之后),但是我们通常可以指出输入通道的个数 通过 in_channels。在对公式增加内边距,宽度和扩张的时候, 2D 卷积核和1D 卷积可能是不一样的。

代码语言:javascript
复制

我们的代码相比单一输入通道的情况是没有改变的

在我们用1D 卷积包装之前, 有一个非常值得一提的常见用例。在自然语言处理的模型中第一个阶段通常需要将有序的原始文本转化成有序的向量,要么是字符,单词或者语句向量。在每一个时间跨度, 我们有一个有特定数值的向量(比如 128), 每一个值代表了字符,单词或者语句的不同属性。我们应当认为他们是时间序列的例子,将他们当做通道。由于我们随着时间的推移得到时间通道,1D 卷积对于本地时间模型的选择非常有效。

Conv2D 多通道输入

彩色图像也是多通道空间数据的一个非常好的例子。在每一个位置,我们通常有3个通道来代表颜色:对于红,绿,蓝不同的颜色强度。但我们这次有一些不一样的方法,我们将使用2个空间维度:高,宽。

图4:彩色图像通常用3个通道代表 (来源:https://www.howtogeek.com/howto/42393/rgb-cmyk-alpha-what-are-image-channels-and-what-do-they-mean/)

我们的内核将相应地调整通道,即使我们定义了一个3x3内核,初始化时内核的真实尺寸将是3x3x3,因为我们有3个输入通道。既然我们又回到了三维,在使用MS Excel之前,让我们先看一下three.js图。

图5:与3x3内核的2D卷积应用于大小为5x5的3通道RGB输入,得到3x3的输出。(源地址:https://thomelane.github.io/convolutions/2DConvRGB.html)

有了上面的图表,如果你想看实际的图像,你应该考虑看上面的图,但是我们感兴趣的是看到通道,因此我们从滑动的角度看。查看此链接以获得上面图表的交互式版本:https://thomelane.github.io/convolutions/2DConvRGB.html。观察到一个有趣的现象是,内核的每个“层”都与输入的相应通道交互。

我们可以在MS Excel中更详细地看到这一点。

图6:与3x3内核的2D卷积应用于大小为5x5的3通道RGB输入,得到3x3的输出。

从这个角度来看,我们认为每个通道都有自己的3x3内核。我们将内核的每个“层”应用于相应的输入通道,并获得中间值,即每个通道的单个值。最后一步是对这些值求和,以获得输出的最终结果。忽略0得到:

红色输出= (3*2) +(1*1) = 7 绿色输出 = (1*2) +(1*3) = 5 蓝色输出 = (2*1) +(3*1) +(1*2) = 7 输出 = 红色输出 + 绿色输出 + 蓝色输出 = 7 +5+ 7 = 19

在实际应用中我们并不会真的去计算那些中间值,但是这样理解很好地诠释了不同输入通道之间的分离。由于我们在最终要得到所有通道值的求和,每个内核实际上是在观察跨越所有通道的模式。

进阶:在上述情况下,该多输入卷积核其实等价于一个形状为(3,3,3)的三维卷积核,但是在用二维卷积的时候你不用指明有几个输入通道。事实上,我们一般会利用对于数据的形状的获取(比如在输入第一批数据之后), 但是我们依然可以利用 in_channels 这个属性去指定输入通道的数量。当加入 填充,步长和空洞时,三维和二维卷积之间的等价关系或许会被破坏。

代码语言:javascript
复制
# define input_data and kernel as above
# input_data.shape is (3, 5, 5)
# kernel.shape is (3, 3, 3)

conv = mx.gluon.nn.Conv2D(channels=1, kernel_size=(3,3))

output_data = apply_conv(input_data, kernel, conv)
print(output_data)

# [[[[19. 13. 15.]
#    [28. 16. 20.]
#    [23. 18. 25.]]]]
# <NDArray 1x1x3x3 @cpu(0)>

在MXNet Gloun中的代码看起来跟单输入通道一样,但是请注意卷积核的形状黑(3,3,3), 因为我们将每个卷积核都用在三个通道上,并且在每个通道中的视野域的长和宽均为3。因此,我们卷积核的布局为(in_channels,hieght,width).

多输出通道的卷积

图7:ImageNet中,能够最大化卷积层中某些卷积核的图像区块(链接:https://arxiv.org/pdf/1311.2901.pdf)。

在我们本系列第一个博客(https://medium.com/apache-mxnet/convolutions-explained-with-ms-excel-465d6649831c)中,我们介绍了,卷积就像一个特征探测器,卷积核定义了我们想要探测的特征。目前为止,在我们所有给出的例子中,我们在每层卷积上均只使用了一个卷积核,也就是说我们只是在寻找一个特征。显然,在图片分类,目标检测和分割等复杂的任务中,我们在每一层卷积网络中需要探测多个特征。

图8:ImageNet中,能够最大化卷积层中某4个卷积核的图像区块(链接:https://arxiv.org/pdf/1311.2901.pdf)。

第一层卷积层,在探测不同角度和不同颜色衬度(就像在多输入通道中我们所看到的哪样)的边或许会很有用。然后在接下来的卷积层中,我们或许就能探测到螺旋,甚至狗脸。

在计算上,加入多个输出通道很简单。我们需要几个输出通道,就只需要将前面的过程重复多少次,当然每次的卷积核是不同且独立的,之后我们将这几次的输出叠在一起,搞定!

图9: 一个1维的卷积层,拥有4个大小为3的卷积核,应用在形状 1x6 的矩阵上,给出了形状 4x4 的输出。

将这张图与上一个博客(https://medium.com/p/5f88c0f35941)中的图2进行比较。这里的第一个卷积核和那个例子中的一模一样,并且我们也得到了一样的(形状为 1x4)输出,但是在这里我们又加上了3个卷积核,最后的输出形状为 4x4。

通常,这很容易添加到 MXNet Gluon的卷积中。我们需要做的,就是改变参数 channels ,把它设为4而不是1。

进阶:我们之前提到一个跟这个参数看上去很像的一个参数 in_channels。注意二者的区别至关重要。in_channels 用于指定输入数据期望的通道数,而不是用卷积核形状来推断(通过传入的第一批数据)。channels 被用来指定需要的输出通道数,比如卷积核/滤波器的数量。

之前,在上一篇文章里提到,一维数卷积的卷积核也是一维的。当有多个输入通道时,我们必须增加额外的维度来解决多通道问题。现在,我们就在关注多个输出通道的问题,我们已经看到另一个问题!也就是对一维卷积实现三维输出。其实这些维度一直到在(很抱歉又向你们隐瞒),但是忽略它们会使问题更简单,因为它们都是单位长度,而且只需要使用 apply_conv 就可以添加这些维度了。

从上面的例子可以看出,卷积的大小为(4, 1, 3)。我们有4个卷积核,每个核都被用在相同的一维(单通道)输入上,在时间维度上,它们的宽度为3。因此,卷积核的形式就为(channels, in_channels, widths)。下表列出了更完整的默认维度形式以便查看。

表1:MXNet Gluon 默认维度

进阶:深度可分离卷积

常见卷积神经网络结构中大部分卷积都被用于多输入多输出问题。计算量与输出通道的数量成线性关系,但当参数 in_channels 和 channels 设置很大时,计算量也相当庞大。一种更有效的解决方法,就是使用深度可分离卷积。我们看一下多输入通道(参见图5),图中在对输入通道求和之前有一个中间步骤。使用深度可分离卷积,可以用1*1卷积代替求和操作。我们基本上把卷积分为两个阶段:第一个阶段关注每个输入通道各自的空间模式,第二个阶段关注各个通道(不是空间上的)。

图10:常见卷积和深度可分离卷积

MXNet Gluon 中,可以使用卷积参数 groups 来指定如何对操作进行分区。可以看看 用 MXNet Gluon 实现 MobileNet 这个使用实例。groups 用来设置输入通道的数量,从而给出深度可分离卷积。

进行实验

本文中展示的所有示例都可以在这些用于 Conv1D 和 Conv2D 的MS Excel电子表格中找到(或分别在此处和此处的谷歌表格中)。单击输出单元格检查公式,并尝试使用不同的内核值更改输出。在MXnet Gluon中复制您的结果后,我认为您可以在LinkedIn配置文件中正式添加“卷积大师”作为标题!

接下来

但在我们理解反卷积之前,这个系列是不会完结的!在这个系列的最后一篇博文中,我们将看到两种不同的思维模式来思考转置卷积,并看到一些实际的例子。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI科技评论 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 多输入通道
  • Conv1D 和多输入通道
  • Conv2D 多通道输入
  • 进阶:深度可分离卷积
  • 进行实验
  • 接下来
相关产品与服务
NLP 服务
NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档