簡體   English   中英

如何在 Wavenet 的 Keras 實現中准備輸入以進行時間序列預測

[英]How to prepare the inputs in Keras implementation of Wavenet for time-series prediction

在 Wavenet 的 Keras 實現中,輸入形狀為 (None, 1)。 我有一個時間序列 (val(t)),其中目標是在給定過去值的 window 的情況下預測下一個數據點(window 的大小取決於最大膨脹)。 Wavenet 中的輸入形狀令人困惑。 我有幾個問題:

  1. 給出完整序列時,Keras 如何計算輸入維度(無)? 根據膨脹,我們希望輸入的長度為 2^8。
  2. 如果給定一個形狀為 (1M, 1) 的輸入序列作為訓練 X,我們是否需要生成 2^8 個時間步長的向量作為輸入? 看來,我們可以只使用輸入序列作為波網的輸入(不確定為什么原始時間序列輸入不會出錯)。
  3. 一般來說,我們如何調試這樣的 Keras 網絡。 我嘗試將 function 應用於 Conv1D(16, 1, padding='same', activation='relu')(inputs) 等數值數據,但是,它給出了錯誤。

#

n_filters = 32
filter_width = 2
dilation_rates = [2**i for i in range(7)] * 2 

from keras.models import Model
from keras.layers import Input, Conv1D, Dense, Activation, Dropout, Lambda, Multiply, Add, Concatenate
from keras.optimizers import Adam

history_seq = Input(shape=(None, 1))
x = history_seq

skips = []
for dilation_rate in dilation_rates:

    # preprocessing - equivalent to time-distributed dense
    x = Conv1D(16, 1, padding='same', activation='relu')(x) 

    # filter
    x_f = Conv1D(filters=n_filters,
                 kernel_size=filter_width, 
                 padding='causal',
                 dilation_rate=dilation_rate)(x)

    # gate
    x_g = Conv1D(filters=n_filters,
                 kernel_size=filter_width, 
                 padding='causal',
                 dilation_rate=dilation_rate)(x)

    # combine filter and gating branches
    z = Multiply()([Activation('tanh')(x_f),
                    Activation('sigmoid')(x_g)])

    # postprocessing - equivalent to time-distributed dense
    z = Conv1D(16, 1, padding='same', activation='relu')(z)

    # residual connection
    x = Add()([x, z])    

    # collect skip connections
    skips.append(z)

# add all skip connection outputs 
out = Activation('relu')(Add()(skips))

# final time-distributed dense layers 
out = Conv1D(128, 1, padding='same')(out)
out = Activation('relu')(out)
out = Dropout(.2)(out)
out = Conv1D(1, 1, padding='same')(out)

# extract training target at end
def slice(x, seq_length):
    return x[:,-seq_length:,:]

pred_seq_train = Lambda(slice, arguments={'seq_length':1})(out)

model = Model(history_seq, pred_seq_train)
model.compile(Adam(), loss='mean_absolute_error')

您正在使用膨脹率的極端值,它們沒有意義。 嘗試使用例如由 [1, 2, 4, 8, 16, 32] 組成的序列來減少它們。 膨脹率不是對傳遞的輸入維度的約束

您的網絡工作只需傳遞此輸入

n_filters = 32
filter_width = 2
dilation_rates = [1, 2, 4, 8, 16, 32]

....

model = Model(history_seq, pred_seq_train)
model.compile(Adam(), loss='mean_absolute_error')

n_sample = 5
time_step = 100

X = np.random.uniform(0,1, (n_sample,time_step,1))

model.predict(X)

在 Keras 中指定 None 維度意味着讓 model 自由接收每個維度。 這並不意味着您可以傳遞各種尺寸的樣本,它們必須始終具有相同的格式......您可以每次使用不同的尺寸大小構建 model

for time_step in np.random.randint(100,200, 4):

  print('temporal dim:', time_step)
  n_sample = 5

  model = Model(history_seq, pred_seq_train)
  model.compile(Adam(), loss='mean_absolute_error')

  X = np.random.uniform(0,1, (n_sample,time_step,1))

  print(model.predict(X).shape)

我還建議您在 Keras 中提供 WAVENET 實現的預制庫: https://github.com/philipperemy/keras-tcn您可以將其用作基線並研究創建 WAVENET 的代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM