1.TCN的介绍

近些年,关于时间序列、自然语言处理等任务大家一般都会想到RNN、LSTM、GRU,一维CNN以及后面延伸出的Bi-Lstm、ConvLstm等等,这是因为RNN天生可以记住以前时段的信息,而传统的神经网络并不具有这个功能。卷积神经网络和循环神经网络作为深度学习的两大支柱,已近被越来越多的学者进行研究。在最近的研究之中,特定的卷积神经网络结构也可以达到很好的效果,比如Goolgle提出的用来做语音合成的wavenet,Facebook提出的用来做翻译的卷积神经网络。这就体现出经过特定设计的卷积神经网络在处理时间序列的任务上也具有巨大的发展潜力,本文就介绍一种特殊的卷积神经网络————时空卷积神经网络(Temporal convolutional network,TCN)。

TCN的表现:

  • TCN与其他网络结构相比具有更长的记忆。
  • 与LSTM/GRU相比,在很多任务上已经表现出更好的效果。
  • 拥有并行的卷积层、灵活大小的卷积核、稳定的梯度。

2.TCN的结构

2.1 因果卷积网络

所谓因果卷积网络是指,上一层t时刻的值只能依赖于下面那层t时刻以及t时刻之前的值,与传统的神经网络不同,TCN不能看见未来的数据,只有前面的才有后面的
在这里插入图片描述

2.2 膨胀卷积方式

膨胀卷积是指卷积的Dilation的大小,也就是卷积的采样间隔大小,通过增加采样间隔的大小,使得网络在较少的层数下就可记住较多以前的信息,一般来说,越高的层使用的Dilation越大。
在这里插入图片描述

2.3 残差块

残差块最开始是用来处理由于神经网络层数过多而出现的网络效果退化的情况。残差神经网络被证明是训练深度网络较好的方法。如上图所示,一个残差块包含两层的卷积和非线性映射,在每层中还加入了WeightNorm和Dropout来正则化网络。
在这里插入图片描述

3.TCN案例(MNIST手写体识别)

这个文件主要是做数据归一化操作的

import numpy as np
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical


def data_generator():
    # input image dimensions
    img_rows, img_cols = 28, 28
    #导入手写数据集形状为(28,28)
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    #print("11111:**",y_train)
    #转化为(784,2)
    x_train = x_train.reshape(-1, img_rows * img_cols, 1)
    print("222222:",x_train.shape)
    x_test = x_test.reshape(-1, img_rows * img_cols, 1)
    #分类数量为0,1,2,3,4,5,6,7,8,9
    num_classes = 10
    #将标签值转化为one-hot编码
    y_train = to_categorical(y_train, num_classes)
    print("yyyyyy",y_train.shape)
    y_test = to_categorical(y_test, num_classes)

    y_train = np.expand_dims(y_train, axis=2)
    print("zzzzzz", y_train.shape)
    y_test = np.expand_dims(y_test, axis=2)

    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')
    x_train /= 255
    x_test /= 255

    return (x_train, y_train), (x_test, y_test)


if __name__ == '__main__':
    print(data_generator())

TCN网络的构建

#TCN网络
from tcn.tcn import TCN
from utils import data_generator
import tensorflow as tf
from tensorflow.keras import layers,Input
# 构建模型
(x_train, y_train), (x_test, y_test) = data_generator()
#构建网络层级
inputs = layers.Input(shape=(x_train.shape[1], x_train.shape[2]), name='inputs')
#神经元(卷积核)20个,卷积核大小6,膨胀大小为2的次方
t=TCN(return_sequences=False,nb_filters=20,kernel_size=6,
                         dilations=[2 ** i for i in range(9)])(inputs)
outputs=layers.Dense(10,activation="softmax")(t)
tcn_model=tf.keras.Model(inputs,outputs)

tcn_model.compile(optimizer="Adam",
                       loss='sparse_categorical_crossentropy',
                       metrics=['accuracy'])

tcn_model.fit(x_train, y_train.squeeze().argmax(axis=1), epochs=100,
              validation_data=(x_test, y_test.squeeze().argmax(axis=1)))
tcn_model.summary()

运行效果
在这里插入图片描述

参考文章

链接: github项目.
链接: TCN博客.
链接: TCN博客.
链接: TCN博客.

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐