如何为时间序列预测准备Wavenet的Keras实施中的输入。

问题描述 投票:0回答:1

在 Wavenet 的 Keras 实现中,输入形状是 (None, 1)。我有一个时间序列(val(t)),其目标是预测下一个数据点,给定一个过去值的窗口(窗口大小取决于最大扩张)。wavenet中的输入形状令人困惑。我对它有几个问题。

  1. 当给定一个完整的序列时,Keras如何计算出输入维度(无)?根据扩张法,我们希望输入的长度为2^8。
  2. 如果给定一个形状为(1M,1)的输入序列作为训练X,我们是否需要生成2^8个时间步长的向量作为输入?似乎只要把输入序列作为波浪网的输入就可以了(不知道为什么原始时间序列的输入不会产生误差)。
  3. 一般来说,我们如何调试这种Keras网络。我试着将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')
tensorflow keras keras-layer
1个回答
2
投票

试着用极端值来减少它们,例如,用[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维度意味着让模型自由地接受每一个维度。这并不意味着你可以传递不同维度的样本,它们必须总是具有相同的格式......你可以每次用不同的维度尺寸来建立模型。

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.comphilipperemykeras-tcn。 你可以用它作为基线,也可以研究创建WAVENET的代码。

© www.soinside.com 2019 - 2024. All rights reserved.