Keras-TCN的API筆記

選西瓜專業戶發表於2020-12-29


因為想用TCN進行時間序列預測,所以我打算研究一下怎麼寫程式碼。
從官網機翻來的。
這是個不成熟的坑,先挖再說。

API

https://pypi.org/project/keras-tcn/
pip install keras-tcn
中文:https://www.cnpython.com/pypi/keras-tcn
https://github.com/philipperemy/keras-tcn/tree/master/tasks

TCN優勢

在大量任務上優於LSTM
並行性、靈活的接受 field 大小、穩定的梯度、訓練時的低記憶要求、可變長度輸入

API引數

TCN(
nb_filters=64,
kernel_size=2,
nb_stacks=1,
dilations=[1, 2, 4, 8, 16, 32],
padding=‘causal’,
use_skip_connections=True,
dropout_rate=0.0,
return_sequences=True,
activation=‘linear’,
kernel_initializer=‘he_normal’
, use_batch_norm=False, **kwargs)

nb_filters: Integer

在卷積層中使用的過濾器的數量,類似於LSTM。

kernel_size

整數,在每個卷積層中使用的核心kernel的大小。

dilations

列表。擴張的列表的一個例子是 : [1, 2, 4, 8, 16, 32, 64].

nb_stacks

整數。要使用的剩餘塊的堆疊( stacks of residual blocks)數量。

padding

String. The padding to use in the convolutions. ‘causal’ for a causal network (as in the original implementation) and ‘same’ for a non-causal network.
字串。在卷積中使用的填充。
在因果網路中使用“因果”(如同最初的實現),而在非因果網路中使用“相同”。

use_skip_connections

Boolean. If we want to add skip connections from input to each residual block.
布林。如果我們想要新增從輸入到每個剩餘塊的跳過連線。

return_sequences

Boolean. Whether to return the last output in the output sequence, or the full sequence.
布林。
是返回輸出序列中的最後一個輸出,還是返回完整序列。

dropout_rate

Float between 0 and 1. Fraction of the input units to drop.
在0和1之間浮動。要下降的輸入單位的分數。

activation

The activation used in the residual blocks o = activation(x + F(x)).
剩餘塊中使用的啟用o =啟用(x + F(x))。

kernel_initializer

Initializer for the kernel weights matrix (Conv1D).
核權值矩陣(Conv1D)的初始化式。

use_batch_norm

Whether to use batch normalization in the residual layers or not.
是否在剩餘層中使用批處理規範化。

kwargs

Any other arguments for configuring parent class Layer. For example “name=str”, Name of the model. Use unique names when using multiple TCN.
用於配置父類層的任何其他引數。
例如"name=str",模型的名稱。使用多個TCN時使用唯一名稱。

Input shape

三維張量形狀(batch_size, timesteps, input_dim)。

具有形狀的三維張量(批量大小、時間步長、輸入維度)

如果每個序列都有不同的長度,這可能很有用:多個長度序列的例子。

Output shape

shape (batch_size, timesteps, nb_filters).
如果return_sequences=true:具有形狀的三維張量(批量大小、時間步長、nb_過濾器)
如果return_sequences=false:具有形狀的2d張量(批量大小,nb_過濾器)

TCN支援的任務型別

迴歸(多對一),例如新增問題
分類(多對多),例如複製記憶體任務
分類(多對一),例如順序任務
對於多對多回歸,目前一個廉價的解決方案是更改最終密集層的單元數。

程式碼示例

①載入模組

from tensorflow.keras.layers import Dense
from tensorflow.keras import Input, Model
from tcn import TCN, tcn_full_summary

②確定batch的大小,時間步,輸入維度

batch_size, timesteps, input_dim = None, 20, 1

③得到訓練集

def get_x_y(size=1000):
    import numpy as np
    pos_indices = np.random.choice(size, size=int(size // 2), replace=False)
    x_train = np.zeros(shape=(size, timesteps, 1))
    y_train = np.zeros(shape=(size, 1))
    x_train[pos_indices, 0] = 1.0
    y_train[pos_indices, 0] = 1.0
    return x_train, y_train

④搭建網路(沒太懂這步,有待研究,備註瞎標)

彷彿它不用 sequential

#i是輸入,讀入之前設定的引數

i = Input(batch_shape=(batch_size, timesteps, input_dim))

#TCN層

o = TCN(return_sequences=False)(i)  # The TCN layers are here.

#全連線層

o = Dense(1)(o)

#模型例項

m = Model(inputs=[i], outputs=[o])

在上面的例子中,tcn也可以像這樣堆疊在一起

o = TCN(return_sequences=True)(i)
o = TCN(return_sequences=False)(o)

⑤配置訓練方法,選擇優化器和損失函式

m.compile(optimizer='adam', loss='mse')

⑥列印網路結構

tcn_full_summary(m, expand_residual_blocks=False)

⑦擬合

x, y = get_x_y()
m.fit(x, y, epochs=10, validation_split=0.2)

現成的TCN使用

完整程式碼見 cf. tasks/

from tcn import compiled_tcn
model = compiled_tcn(...)
model.fit(x, y) # Keras model.

相關文章