精华内容
下载资源
问答
  • 时间序列预测——时序卷积网络中用到的tcn库文件。
  • 时序卷积网络(Temporal convolutional network, TCN)的提出是为了是卷积神经网络具备时序特性,与多种RNN结构相对比,发现在多种任务上TCN都能达到甚至超过RNN模型。 TCN主要基于因果卷积和膨胀卷积(Dilated ...

    时序卷积网络(Temporal convolutional network, TCN)的提出是为了是卷积神经网络具备时序特性,与多种RNN结构相对比,发现在多种任务上TCN都能达到甚至超过RNN模型。

    TCN主要基于因果卷积和膨胀卷积(Dilated Convolution)

    因果卷积

    从直观上来说,它类似于将卷积运算「劈」去一半,令其只能对过去时间步的输入进行运算。对于 TCN 所使用的一维卷积来说,因果卷积可以简单将一般卷积的输出移动几个时间步而实现。TCN使用因果卷积,其中时间t的输出仅与来自前一层中的时间t和更早的元素卷积。

    38502b7742f19be3b8fa18cc6a8cf910.png

    因果卷积可以用上图直观表示。 即对于上一层t时刻的值,只依赖于下一层t时刻及其之前的值。和传统的卷积神经网络的不同之处在于,因果卷积不能看到未来的数据,它是单向的结构,不是双向的。也就是说只有有了前面的因才有后面的果,是一种严格的时间约束模型,因此被成为因果卷积。

    膨胀卷积(Dilated Convolution)

    单纯的因果卷积还是存在传统卷积神经网络的问题,即对时间的建模长度受限于卷积核大小的,如果要想抓去更长的依赖关系,就需要线性的堆叠很多的层。为了解决这个问题,研究人员提出了膨胀卷积。如下图所示。

    d4e7ddbef8beb6194e002a42e26da3af.png


    和传统卷积不同的是,膨胀卷积允许卷积时的输入存在间隔采样,采样率受图中的d控制。 最下面一层的d=1,表示输入时每个点都采样,中间层d=2,表示输入时每2个点采样一个作为输入。一般来讲,越高的层级使用的d的大小越大。所以,膨胀卷积使得有效窗口的大小随着层数呈指数型增长。这样卷积网络用比较少的层,就可以获得很大的感受野。

    展开全文
  •   本文展示了使用时序卷积网络(TCN)进行时间序列预测的全过程,包含详细的注释。整个过程主要包括:数据导入、数据清洗、结构转化、建立TCN模型、训练模型(包括动态调整学习率和earlystopping的设置)、预测、...

      本文展示了使用时序卷积网络(TCN)进行时间序列预测的全过程,包含详细的注释。整个过程主要包括:数据导入、数据清洗、结构转化、建立TCN模型、训练模型(包括动态调整学习率和earlystopping的设置)、预测、结果展示、误差评估等完整的时间序列预测流程。
      本文使用的tcn库在本人上传的资源中,链接为tcn.py
      本文使用的数据集在本人上传的资源中,链接为mock_kaggle.csv

    import pandas as pd
    import numpy as np
    import math
    from matplotlib import pyplot as plt
    from matplotlib.pylab import mpl
    import tensorflow as tf
    from sklearn.preprocessing import MinMaxScaler
    from keras import backend as K
    from keras.layers import LeakyReLU
    from tcn import TCN,tcn_full_summary
    from sklearn.metrics import mean_squared_error # 均方误差
    from keras.callbacks import LearningRateScheduler
    from keras.callbacks import EarlyStopping
    from tensorflow.keras import Input, Model,Sequential
    
    
    mpl.rcParams['font.sans-serif'] = ['SimHei']   #显示中文
    mpl.rcParams['axes.unicode_minus']=False       #显示负号
    

    取数据

    data=pd.read_csv('mock_kaggle.csv',encoding ='gbk',parse_dates=['datetime'])
    Date=pd.to_datetime(data.datetime)
    data['date'] = Date.map(lambda x: x.strftime('%Y-%m-%d'))
    datanew=data.set_index(Date)
    series = pd.Series(datanew['股票'].values, index=datanew['date'])
    
    series
    
    date
    2014-01-01    4972
    2014-01-02    4902
    2014-01-03    4843
    2014-01-04    4750
    2014-01-05    4654
                  ... 
    2016-07-27    3179
    2016-07-28    3071
    2016-07-29    4095
    2016-07-30    3825
    2016-07-31    3642
    Length: 937, dtype: int64
    

    滞后扩充数据

    dataframe1 = pd.DataFrame()
    num_hour = 16
    for i in range(num_hour,0,-1):
        dataframe1['t-'+str(i)] = series.shift(i)
    dataframe1['t'] = series.values
    dataframe3=dataframe1.dropna()
    dataframe3.index=range(len(dataframe3))
    
    dataframe3
    
    t-16 t-15 t-14 t-13 t-12 t-11 t-10 t-9 t-8 t-7 t-6 t-5 t-4 t-3 t-2 t-1 t
    0 4972.0 4902.0 4843.0 4750.0 4654.0 4509.0 4329.0 4104.0 4459.0 5043.0 5239.0 5118.0 4984.0 4904.0 4822.0 4728.0 4464
    1 4902.0 4843.0 4750.0 4654.0 4509.0 4329.0 4104.0 4459.0 5043.0 5239.0 5118.0 4984.0 4904.0 4822.0 4728.0 4464.0 4265
    2 4843.0 4750.0 4654.0 4509.0 4329.0 4104.0 4459.0 5043.0 5239.0 5118.0 4984.0 4904.0 4822.0 4728.0 4464.0 4265.0 4161
    3 4750.0 4654.0 4509.0 4329.0 4104.0 4459.0 5043.0 5239.0 5118.0 4984.0 4904.0 4822.0 4728.0 4464.0 4265.0 4161.0 4091
    4 4654.0 4509.0 4329.0 4104.0 4459.0 5043.0 5239.0 5118.0 4984.0 4904.0 4822.0 4728.0 4464.0 4265.0 4161.0 4091.0 3964
    ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
    916 1939.0 1967.0 1670.0 1532.0 1343.0 1022.0 813.0 1420.0 1359.0 1075.0 1015.0 917.0 1550.0 1420.0 1358.0 2893.0 3179
    917 1967.0 1670.0 1532.0 1343.0 1022.0 813.0 1420.0 1359.0 1075.0 1015.0 917.0 1550.0 1420.0 1358.0 2893.0 3179.0 3071
    918 1670.0 1532.0 1343.0 1022.0 813.0 1420.0 1359.0 1075.0 1015.0 917.0 1550.0 1420.0 1358.0 2893.0 3179.0 3071.0 4095
    919 1532.0 1343.0 1022.0 813.0 1420.0 1359.0 1075.0 1015.0 917.0 1550.0 1420.0 1358.0 2893.0 3179.0 3071.0 4095.0 3825
    920 1343.0 1022.0 813.0 1420.0 1359.0 1075.0 1015.0 917.0 1550.0 1420.0 1358.0 2893.0 3179.0 3071.0 4095.0 3825.0 3642

    921 rows × 17 columns

    二折划分数据并标准化

    # pot=int(len(dataframe3)*0.8)
    pd.DataFrame(np.random.shuffle(dataframe3.values))  #shuffle
    pot=len(dataframe3)-12
    train=dataframe3[:pot]
    test=dataframe3[pot:]
    scaler = MinMaxScaler(feature_range=(0, 1)).fit(train)
    #scaler = preprocessing.StandardScaler().fit(train)
    train_norm=pd.DataFrame(scaler.fit_transform(train))
    test_norm=pd.DataFrame(scaler.transform(test))
    
    test_norm.shape,train_norm.shape
    
    ((12, 17), (909, 17))
    
    X_train=train_norm.iloc[:,1:]
    X_test=test_norm.iloc[:,1:]
    Y_train=train_norm.iloc[:,:1]
    Y_test=test_norm.iloc[:,:1]
    

    转换为3维数据 [samples, timesteps, features]

    source_x_train=X_train
    source_x_test=X_test
    X_train=X_train.values.reshape([X_train.shape[0],1,X_train.shape[1]]) #从(696, 35)-->(696, 1,35)
    X_test=X_test.values.reshape([X_test.shape[0],1,X_test.shape[1]])  #从(174, 35)-->(174, 1,35)
    Y_train=Y_train.values
    Y_test=Y_test.values
    
    X_train.shape,Y_train.shape
    
    ((909, 1, 16), (909, 1))
    
    X_test.shape,Y_test.shape
    
    ((12, 1, 16), (12, 1))
    
    type(X_train),type(Y_test)
    
    (numpy.ndarray, numpy.ndarray)
    

    动态调整学习率与提前终止函数

    def scheduler(epoch):
        # 每隔50个epoch,学习率减小为原来的1/10
        if epoch % 50 == 0 and epoch != 0:
            lr = K.get_value(tcn.optimizer.lr)
            if lr>1e-5:
                K.set_value(tcn.optimizer.lr, lr * 0.1)
                print("lr changed to {}".format(lr * 0.1))
        return K.get_value(tcn.optimizer.lr)
    
    reduce_lr = LearningRateScheduler(scheduler)
    early_stopping = EarlyStopping(monitor='loss', 
                                   patience=20, 
                                   min_delta=1e-5,
                                   mode='auto',
                                   restore_best_weights=False,#是否从具有监测数量的最佳值的时期恢复模型权重
                                   verbose=2)
    

    构造TCN模型

    batch_size=None
    timesteps=X_train.shape[1]
    input_dim=X_train.shape[2] #输入维数
    tcn = Sequential()
    input_layer =Input(batch_shape=(batch_size,timesteps,input_dim))
    tcn.add(input_layer)
    tcn.add(TCN(nb_filters=64, #在卷积层中使用的过滤器数。可以是列表。
            kernel_size=3, #在每个卷积层中使用的内核大小。
            nb_stacks=1,   #要使用的残差块的堆栈数。
            dilations=[2 ** i for i in range(6)], #扩张列表。示例为:[1、2、4、8、16、32、64]。
            #用于卷积层中的填充,值为'causal' 或'same'。
            #“causal”将产生因果(膨胀的)卷积,即output[t]不依赖于input[t+1:]。当对不能违反时间顺序的时序信号建模时有用。
            #“same”代表保留边界处的卷积结果,通常会导致输出shape与输入shape相同。
            padding='causal',
            use_skip_connections=True, #是否要添加从输入到每个剩余块的跳过连接。
            dropout_rate=0.1, #在0到1之间浮动。要下降的输入单位的分数。
            return_sequences=False,#是返回输出序列中的最后一个输出还是完整序列。
            activation='relu', #残差块中使用的激活函数 o = Activation(x + F(x)).
            kernel_initializer='he_normal', #内核权重矩阵(Conv1D)的初始化程序。
            use_batch_norm=True, #是否在残差层中使用批处理规范化。
            use_layer_norm=True, #是否在残差层中使用层归一化。
            name='tcn' #使用多个TCN时,要使用唯一的名称
            ))
    tcn.add(tf.keras.layers.Dense(64))
    tcn.add(tf.keras.layers.LeakyReLU(alpha=0.3))
    tcn.add(tf.keras.layers.Dense(32))
    tcn.add(tf.keras.layers.LeakyReLU(alpha=0.3))
    tcn.add(tf.keras.layers.Dense(16))
    tcn.add(tf.keras.layers.LeakyReLU(alpha=0.3))
    tcn.add(tf.keras.layers.Dense(1))
    tcn.add(tf.keras.layers.LeakyReLU(alpha=0.3))
    tcn.compile('adam', loss='mse', metrics=['accuracy'])
    tcn.summary()
    
    Model: "sequential"
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    tcn (TCN)                    (None, 64)                143168    
    _________________________________________________________________
    dense (Dense)                (None, 64)                4160      
    _________________________________________________________________
    leaky_re_lu (LeakyReLU)      (None, 64)                0         
    _________________________________________________________________
    dense_1 (Dense)              (None, 32)                2080      
    _________________________________________________________________
    leaky_re_lu_1 (LeakyReLU)    (None, 32)                0         
    _________________________________________________________________
    dense_2 (Dense)              (None, 16)                528       
    _________________________________________________________________
    leaky_re_lu_2 (LeakyReLU)    (None, 16)                0         
    _________________________________________________________________
    dense_3 (Dense)              (None, 1)                 17        
    _________________________________________________________________
    leaky_re_lu_3 (LeakyReLU)    (None, 1)                 0         
    =================================================================
    Total params: 149,953
    Trainable params: 148,417
    Non-trainable params: 1,536
    _________________________________________________________________
    

    训练

    history=tcn.fit(X_train,Y_train, epochs=80,batch_size=32,callbacks=[reduce_lr])
    
    Train on 909 samples
    Epoch 1/80
    909/909 [==============================] - 14s 16ms/sample - loss: 0.1332 - accuracy: 0.0187
    Epoch 2/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0449 - accuracy: 0.0176
    Epoch 3/80
    909/909 [==============================] - 1s 2ms/sample - loss: 0.0333 - accuracy: 0.0187
    Epoch 4/80
    909/909 [==============================] - 1s 2ms/sample - loss: 0.0206 - accuracy: 0.0187
    Epoch 5/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0194 - accuracy: 0.0187
    Epoch 6/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0261 - accuracy: 0.0187
    Epoch 7/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0182 - accuracy: 0.0176
    Epoch 8/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0144 - accuracy: 0.0187
    Epoch 9/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0137 - accuracy: 0.0187
    Epoch 10/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0135 - accuracy: 0.0187
    Epoch 11/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0104 - accuracy: 0.0187
    Epoch 12/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0100 - accuracy: 0.0187
    Epoch 13/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0099 - accuracy: 0.0187
    Epoch 14/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0100 - accuracy: 0.0187
    Epoch 15/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0102 - accuracy: 0.0187
    Epoch 16/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0105 - accuracy: 0.0187
    Epoch 17/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0095 - accuracy: 0.0187
    Epoch 18/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0102 - accuracy: 0.0187
    Epoch 19/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0097 - accuracy: 0.0187
    Epoch 20/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0091 - accuracy: 0.0187
    Epoch 21/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0093 - accuracy: 0.0187
    Epoch 22/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0101 - accuracy: 0.0187
    Epoch 23/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0086 - accuracy: 0.0187
    Epoch 24/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0117 - accuracy: 0.0187
    Epoch 25/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0071 - accuracy: 0.01870s - loss: 0.006
    Epoch 26/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0087 - accuracy: 0.0187
    Epoch 27/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0111 - accuracy: 0.0187
    Epoch 28/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0095 - accuracy: 0.0176
    Epoch 29/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0080 - accuracy: 0.0187
    Epoch 30/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0090 - accuracy: 0.0176
    Epoch 31/80
    909/909 [==============================] - 1s 2ms/sample - loss: 0.0081 - accuracy: 0.0187
    Epoch 32/80
    909/909 [==============================] - 1s 2ms/sample - loss: 0.0092 - accuracy: 0.0187
    Epoch 33/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0086 - accuracy: 0.0187
    Epoch 34/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0071 - accuracy: 0.0187
    Epoch 35/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0074 - accuracy: 0.0187
    Epoch 36/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0066 - accuracy: 0.0187
    Epoch 37/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0057 - accuracy: 0.0187
    Epoch 38/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0068 - accuracy: 0.0187
    Epoch 39/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0065 - accuracy: 0.0187
    Epoch 40/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0059 - accuracy: 0.0187
    Epoch 41/80
    909/909 [==============================] - 1s 2ms/sample - loss: 0.0073 - accuracy: 0.0187
    Epoch 42/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0076 - accuracy: 0.0187
    Epoch 43/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0068 - accuracy: 0.0187
    Epoch 44/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0053 - accuracy: 0.0187
    Epoch 45/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0054 - accuracy: 0.0187
    Epoch 46/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0060 - accuracy: 0.0187
    Epoch 47/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0064 - accuracy: 0.01870s - loss: 0.0063 - accuracy: 0.01
    Epoch 48/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0055 - accuracy: 0.0187
    Epoch 49/80
    909/909 [==============================] - 1s 2ms/sample - loss: 0.0056 - accuracy: 0.0187
    Epoch 50/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0067 - accuracy: 0.0187
    lr changed to 0.00010000000474974513
    Epoch 51/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0058 - accuracy: 0.0187
    Epoch 52/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0050 - accuracy: 0.0187
    Epoch 53/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0058 - accuracy: 0.0187
    Epoch 54/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0047 - accuracy: 0.0187
    Epoch 55/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0054 - accuracy: 0.0187
    Epoch 56/80
    909/909 [==============================] - 1s 2ms/sample - loss: 0.0047 - accuracy: 0.0187
    Epoch 57/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0051 - accuracy: 0.0187
    Epoch 58/80
    909/909 [==============================] - 1s 2ms/sample - loss: 0.0063 - accuracy: 0.0187
    Epoch 59/80
    909/909 [==============================] - 1s 2ms/sample - loss: 0.0060 - accuracy: 0.0187
    Epoch 60/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0047 - accuracy: 0.0187
    Epoch 61/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0054 - accuracy: 0.0187
    Epoch 62/80
    909/909 [==============================] - 2s 2ms/sample - loss: 0.0049 - accuracy: 0.0187
    Epoch 63/80
    909/909 [==============================] - 1s 2ms/sample - loss: 0.0051 - accuracy: 0.0187
    Epoch 64/80
    909/909 [==============================] - 1s 2ms/sample - loss: 0.0051 - accuracy: 0.0187
    Epoch 65/80
    909/909 [==============================] - 2s 2ms/sample - loss: 0.0048 - accuracy: 0.0187
    Epoch 66/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0052 - accuracy: 0.0187
    Epoch 67/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0051 - accuracy: 0.0187
    Epoch 68/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0048 - accuracy: 0.0187
    Epoch 69/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0049 - accuracy: 0.0187
    Epoch 70/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0057 - accuracy: 0.0187
    Epoch 71/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0050 - accuracy: 0.0187
    Epoch 72/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0049 - accuracy: 0.0187
    Epoch 73/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0052 - accuracy: 0.0187
    Epoch 74/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0048 - accuracy: 0.0187
    Epoch 75/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0053 - accuracy: 0.0187
    Epoch 76/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0049 - accuracy: 0.0187
    Epoch 77/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0054 - accuracy: 0.0187
    Epoch 78/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0055 - accuracy: 0.0187
    Epoch 79/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0055 - accuracy: 0.0187
    Epoch 80/80
    909/909 [==============================] - 1s 1ms/sample - loss: 0.0050 - accuracy: 0.0187
    
    history.history.keys() #查看history中存储了哪些参数
    plt.plot(history.epoch,history.history.get('loss')) #画出随着epoch增大loss的变化图
    #plt.plot(history.epoch,history.history.get('acc'))#画出随着epoch增大准确率的变化图
    

    在这里插入图片描述

    预测

    predict = tcn.predict(X_test)
    real_predict=scaler.inverse_transform(np.concatenate((source_x_test,predict),axis=1))
    real_y=scaler.inverse_transform(np.concatenate((source_x_test,Y_test),axis=1))
    real_predict=real_predict[:,-1]
    real_y=real_y[:,-1]
    

    误差评估

    plt.figure(figsize=(15,6))
    bwith = 0.75 #边框宽度设置为2
    ax = plt.gca()#获取边框
    ax.spines['bottom'].set_linewidth(bwith)
    ax.spines['left'].set_linewidth(bwith)
    ax.spines['top'].set_linewidth(bwith)
    ax.spines['right'].set_linewidth(bwith)
    plt.plot(real_predict,label='real_predict')
    plt.plot(real_y,label='real_y')
    plt.plot(real_y*(1+0.15),label='15%上限',linestyle='--',color='green')
    # plt.plot(real_y*(1+0.1),label='10%上限',linestyle='--')
    # plt.plot(real_y*(1-0.1),label='10%下限',linestyle='--')
    plt.plot(real_y*(1-0.15),label='15%下限',linestyle='--',color='green')
    plt.fill_between(range(0,12),real_y*(1+0.15),real_y*(1-0.15),color='gray',alpha=0.2)
    plt.legend()
    plt.show()
    

    在这里插入图片描述

    round(mean_squared_error(Y_test,predict),4)
    
    0.0012
    
    from sklearn.metrics import r2_score
    round(r2_score(real_y,real_predict),4)
    
    0.5192
    
    per_real_loss=(real_y-real_predict)/real_y
    avg_per_real_loss=sum(abs(per_real_loss))/len(per_real_loss)
    print(avg_per_real_loss)
    
    0.13984217335814073
    
    #计算指定置信水平下的预测准确率
    #level为小数
    def comput_acc(real,predict,level):
        num_error=0
        for i in range(len(real)):
            if abs(real[i]-predict[i])/real[i]>level:
                num_error+=1
        return 1-num_error/len(real)
    
    comput_acc(real_y,real_predict,0.2),comput_acc(real_y,real_predict,0.15),comput_acc(real_y,real_predict,0.1)
    
    (0.75, 0.6666666666666667, 0.33333333333333337)
    
    展开全文
  • 1.Human Action Recognition using Factorized Spatio-...把时序数据的三维卷积分解成先2维空间卷积 (spatial convolutional layer), 再1维的时间卷积(temporal convolutional layers)。 视频片段切割:...

    1.  Human Action Recognition using Factorized Spatio-Temporal Convolutional Networks    ICCV2015 

    把时序数据的三维卷积分解成先2维空间卷积 (spatial convolutional layer), 再1维的时间卷积(temporal convolutional layers)。

    视频片段切割:剪裁数据增强,固定时间段切割。

    Vdiff:时间相隔dt的画面之间的diff,以捕捉短程信息。与V的长程信息一起来预测。

    ImageNet预训练:2-D空间卷积可以允许使用图片来进行预训练。

    SCI based score fusion:多个结果不平均对待,给可信度最高的结果更高的权重来得到更好的结果。

    可以参考博客:https://blog.csdn.net/zzmshuai/article/details/84880257

    2. Temporal Convolutional Networks for Action Segmentation and Detection   CVPR2017

    EncoderDecoder TCN

    Dilated TCN

    结合了causal convolution, residual connection 和 dilation convolution.

    参考博客:https://juejin.im/entry/5b04dac96fb9a07ab979d665/

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

    参考博客:http://nooverfit.com/wp/%E6%97%B6%E9%97%B4%E5%8D%B7%E7%A7%AF%E7%BD%91%E7%BB%9Ctcn-%E6%80%BB%E7%BB%93%EF%BC%9A%E6%97%B6%E5%BA%8F%E6%A8%A1%E5%9E%8B%E4%B8%8D%E5%86%8D%E6%98%AF%E9%80%92%E5%BD%92%E7%BD%91%E7%BB%9Crnn/?yyue=a21bo.50862.201879

    4. Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting   IJCAI2018

    参考博客:https://davidham3.github.io/blog/2018/05/10/spatio-temporal-graph-convolutional-networks-a-deep-learning-framework-for-traffic/

     

    代码(Source Code):

    论文3作者提供的pytorch版本:https://github.com/locuslab/TCN

    keras版本:https://github.com/philipperemy/keras-tcn

    Tensorflow版本:https://github.com/Baichenjia/Tensorflow-TCN

    展开全文
  • 首先,列出运动检测个案分析并简要回顾TCN架构及其相对于传统方法的优势,如卷积神经网络(CNN)和递归神经网络(RNN),随后,笔者将介绍使用TCN的几个创新之处,包括改善交通预测,声音事件定位和检测以及概率预测。...

    全文共1921字,预计学习时长5分钟

    298b8014becf2ed44266c32a95a3359c.png

    图源:unsplash

    本文将回顾基于TCN解决方案的最新创新。首先,列出运动检测个案分析并简要回顾TCN架构及其相对于传统方法的优势,如卷积神经网络(CNN)和递归神经网络(RNN),随后,笔者将介绍使用TCN的几个创新之处,包括改善交通预测,声音事件定位和检测以及概率预测。

    对TCN的简要回顾

    Lea等人(2016)的开创性著作首次提出一种基于视频动作分割的时序卷积网络(TCNs)。这一常规过程包括两步:首先是低级特征的计算,这些计算(通常)使用对时空信息进行编码的CNN,其次将这些低级特征输入到一个(通常)使用RNN采集高级时间信息的分类器中。

    这种方法的主要缺点是需要两个独立模型,而TCN提供了一个统一的方法,可以分层次地获取所有两个等级的信息。

    编码-解码架构如下图所示,文末前两个参考文献展示了有关该架构的更多信息。最关键的问题如下:TCN可取一系列任意长度并以相同的长度输出。因果卷积在使用一维全卷积网络架构时使用。一个关键的特征是t时刻的输出只与t之前的元素进行卷积。

    8e62cb747e150baa35a3528a2509de26.png

    Lea等人 (2016)

    随着最近Yan等人(2020)有关TCN用于天气预报的研究成果发表,《自然》杂志上逐渐出现了有关TCN的讨论。在研究中,他们把TCN和LSTM进行对比实验。在其他方法中,其中一个结论是TCN在处理时间序列数据的预测任务中表现良好。

    ffaefc0afb56a9c30f7e241ed6994ff4.png

    Yan等人(2020)

    接着笔者将介绍经典TCN的运用和延伸。

    改善交通预测

    共享乘车和在线导航服务可以改善交通预测及改变生活方式。减少交通堵塞,降低污染,安全快速的驾驶……更优的交通预测能做的远不止于此。

    这是一种实时数据驱动问题,因而有必要利用未来交通流量的数据累积。基于此,Dai等人(2020)近期提出了一种混合时空图卷积网络(H-STGCN),总体思路为利用分段-线型-流量-密度关系,将未来交通量转换为其等效的行程时间。

    在文章中,学者们使用的最有趣的方法之一是利用图卷积捕捉空间依赖性。复合邻接矩阵捕捉了交通近似的本质特征(参见[Li, 2017]获取更多信息)。下列架构采用四个模块描述整个预测过程:

    9c1ccbb48df97c3c3b127f810a3d4f13.png

    Dai 等人 (2020)

    声音事件定位和检测

    声音事件定位和检测(SELD)领域不断扩大,理解环境在自主导航中扮演着重要角色。

    最近,Guirguis等人(2020)提出了一种声音事件SELD-TCN的新型架构,并声称这种架构训练时间更快,优于该领域的最高水准。在他们的SELDnet中(如下架构),一个采样为44.1kHz的多通道音频录制运用短时傅里叶变换提取频谱的相位和幅度并将其作为单独的输入特性堆叠。接着,连接卷积块和循环块(双向GRUs),然后连接全连接块。SELDnet的输出是声音事件检测(SED)和波达方向(DOA)。

    0517773a749e64f03f8478e48b1d29f9.png

    Guirguis 等人(2020)

    为了超越它,他们提出了SELD-TCN:

    006adc50ccc474c480a929eef7adf4a0.png

    Guirguis 等人 (2020)

    由于空洞卷积使网络能够处理各种输入,因而需要一个更深入的网络(它在反向传播过程中会受到不稳定梯度的影响)。他们采用WaveNet(Dario等人, 2017)架构克服这一挑战,展示SELD任务不需要循环层,并成功检测到活跃声音事件的开始和结束时间。

    概率预测

    Chen等人(2020)设计的新型架构能应用于估计概率密度。时间序列预测能改善许多经营决策场景(例如资源管理),概率预测可以从历史数据中提取信息,将未来事件的不确定性降至最低。当预测任务用来预测数百万个相关数据序列(就像在零售业务中),需要禁止性劳动和计算资源来进行参数估计。

    为了解决这些困难,他们提出了一种基于CNN的密度估计和预测架构。这种架构能学习序列中的潜在相关性。他们的成果的新奇之处在于提出的深层TCN,如架构所示:

    3863811af12ed0c31b7b3996ac798c2a.png

    Chen 等人 (2020)

    由此可见,编码-解码模块解决方案可以帮助实际大型应用的设计。

    本文总结了关于时序卷积网络的一些最新成果,它能比经典CNN和RNN方法更好地完成时间序列任务。

    1902a87b8589c27fa2fc15e8b2c827d0.png

    留言点赞关注

    我们一起分享AI学习与发展的干货

    如转载,请后台留言,遵守转载规范

    展开全文
  • T-C3D 实时行为识别时序卷积网络

    千次阅读 2019-12-11 22:43:40
    为了详细阐述这个结构,文章引入了几个部分,具体由Temporal Encoding Model(时序编码模型),Video Components Generation(视频成分产生),3D Convolution Neural Network(3D卷积网络),Aggregation Functions...
  • 卷积神经网络-时序卷积

    千次阅读 2020-06-18 10:09:02
    传统的卷积神经网络一般认为不太适合时序问题的建模,这主要由于其卷积核大小的限制,不能很好的抓取长时的依赖信息。 但是也有很多的工作显示,特定的卷积神经网络结构也可以达到很好的效果,比如Goolgle提出的用来...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 221
精华内容 88
关键字:

时序卷积网络