array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 TCN时间卷积网络——解决LSTM的并发问题 - 爱码网
bonelee

TCN是指时间卷积网络,一种新型的可以用来解决时间序列预测的算法。在这一两年中已有多篇论文提出,但是普遍认为下篇论文是TCN的开端。

论文名称:

An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling

作者:Shaojie Bai 1 J. Zico Kolter 2 Vladlen Koltun 3

自从TCN提出后引起了巨大反响,有人认为

时间卷积网络(TCN)将取代RNN成为NLP或者时序预测领域的王者。

William Vorhies给出的原因如下:

RNN耗时太长,由于网络一次只读取、解析输入文本中的一个单词(或字符),深度神经网络必须等前一个单词处理完,才能进行下一个单词的处理。这意味着 RNN 不能像 CNN 那样进行大规模并行处理。

并且TCN的实际结果也要优于RNN算法。

所以本教程未来几次更新将集中介绍TCN的算法含义与代码解读。

 

2

什么是TCN?

TCN中涉及到了最简单的CNN和RNN,此处暂不赘述。还涉及到了一维卷积,扩张卷积,因果卷积,残差卷积的跳层连接等其他知识点。为了能够更准确的了解,我们将结合论文逐步介绍每个部分。

一维卷积

以下图为例:图中的输入的数据维度为8,过滤器的维度为5。那么卷积后输出的数据维度为8−5+1=4

如果过滤器数量为1,输入数据的channel数量变为,即输入数据维度为8×32。这里channel的概念相当于自然语言处理中的embedding,而该输入数据代表8个单词,其中每个单词的词向量维度大小为32。在这种情况下,过滤器的维度由5变为5×32,最终输出的数据维度仍为4。

如果过滤器数量为n,那么输出的数据维度就变为4×n。

其实可以看出模型基本上与二维卷积相同,非常容易理解。

扩张卷积

扩张卷积与普通的卷积相比,除了卷积核的大小以外,还有一个扩张率(dilation rate)参数,主要用来表示扩张的大小。

扩张卷积与普通卷积的相同点在于,卷积核的大小是一样的,神经网络中的参数数量不变。

两者区别区别在于扩张卷积具有更大的感受野。感受野是卷积核在图像上看到的大小,例如3×3卷积核的感受野大小为9。

例如下图是普通卷积,卷积核的感受野为3×3=9。

例如下图是扩张卷积,卷积核的感受野为7×7=49

下次更新将介绍因果卷积,残差卷积的跳层连接,并结合论文讲解TCN。

 

TCN

 

上次初步介绍了TCN,时间卷积网络,一种新型的可以用来解决时间序列预测的算法。TCN中涉及到了一维卷积,扩张卷积,因果卷积,残差卷积的跳层连接等其他知识点。

每天三分钟之Pytorch编程-5:RNN的新对手TCN(1)

上次也介绍了一维卷积和扩张卷积。

需要补充的是扩张卷积的好处是不做pooling损失信息的情况下,加大了感受野,让每个卷积输出都包含较大范围的信息。

下面来介绍因果卷积,残差卷积的跳层连接

因果卷积

因果卷积的理解可以认为是:不管是自然语言处理领域中的预测还是时序预测,都要求对时刻t 的预测yt只能通过t时刻之前的输入x1到xt-1来判别。这种思想有点类似于马尔科夫链。

残差卷积的跳层连接

微软的残差网络 ResNet 就是经典的跳层连接(skip-connection),如下图所示。

上一层的特征图 x 直接与卷积后的 F(x)对齐加和,变为 F(x)+x (特征图数量不够可用 0 特征补齐,特征图大小不一可用带步长卷积做下采样)。

这样在每层特征图中添加上一层的特征信息,可使网络更深,加快反馈与收敛。

但是 ResNet 也有明显的缺陷:无法证明把每一层特征图硬连接到下一层都是有用的;并且实验证明把 ResNet 变深,不如把 ResNet 变宽, 即到了一定深度,加深网络已经无法使 ResNet 准确度提升了(还不如把网络层像 Inception 那样变宽)。

全卷积网络

时间卷积网络也用到了全卷积网络,全卷积网络(FCN)是在下篇论文中提出的:

论文 : Fully Convolutional Networks for Semantic Segmentation

 

FCN与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类不同,FCN可以接受任意尺寸的输入,采用卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到与输入相同的尺寸,再进行预测。

TCN时间卷积网络

下面将介绍时间卷积网络中的一维卷积,扩张卷积,因果卷积,残差卷积的跳 层连接是如何体现的,以及之间的关联。

(a)图为空洞系数 d=1, 2, 4、卷积核大小 k=3 的扩张卷积,感受野能覆盖输入序列中的所有值。

上式即为扩张卷积的计算公式,d为扩展系数。

(b)为 TCN 残差块,当残差输入和输出有不同的维度,会往其中添加一个 1x1 的卷积。

(c)为 残差连接的示例,蓝线为残差函数中的卷积核,绿线为恒等映射。

 

TCN 的卷积层结合了扩张卷积因果卷积两种结构。使用因果卷积的目的是为了保证前面时间步的预测不会使用未来的信息,因为时间步 t 的输出只会根据 t-1 及之前时间步上的卷积运算得出。

可以看出,TCN的卷积和普通的一维卷积非常类似,只不过最大的不同是用了扩张卷积,随着层数越多,卷积窗口越大,卷积窗口中的空孔会越多。

值得一提的是在 TCN 的残差模块内(即图b)有两层扩张卷积和 ReLU 非线性函数,且卷积核的权重都经过了权重归一化。此外TCN 在残差模块内的每个空洞卷积后都添加了 Dropout 以实现正则化。

 

论文中跳层连接时直接将下层的特征图跳层连接到上层,这样的话对应的通道数channel不一致,所以不能直接做加和操作,于是,为了两个层加和时特征图数量,即通道数数量相同,作者通过用1×1卷积进行元素合并来保证两个张量的形状相同。

总结来讲,时间卷积网络是:

同时用到一维因果卷积和扩张卷积作为标准卷积层,并将每两个这样的卷积层与恒等映射可以封装为一个残差模块(包含了relu函数)。再由残差模块堆叠起深度网络,并在最后几层使用全卷积层代替全连接层。

由于TCN涉及内容较多,所以本次更新简要介绍整体框架,下次将着重对其中部分细节解释,并开始详解代码。

分类:

技术点:

相关文章: