gpt4 book ai didi

python - 如何在 Wavenet 的 Keras 实现中准备输入以进行时间序列预测

转载 作者:行者123 更新时间:2023-12-04 01:23:12 28 4
gpt4 key购买 nike

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

  • 当给定完整序列时,Keras 如何计算输入维度(无)?根据扩张,我们希望输入的长度为 2^8。
  • 如果输入一系列形状 (1M, 1) 作为训练 X 给出,我们是否需要生成 2^8 时间步长的向量作为输入?看来,我们可以只使用输入序列作为 wave-net 的输入(不确定为什么原始时间序列输入不会出错)。
  • 一般来说,我们如何调试这样的 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')

    最佳答案

    您正在使用膨胀率的极端值,它们没有意义。尝试使用例如由 [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.com/philipperemy/keras-tcn您可以将其用作基线并调查创建 WAVENET 的代码

    关于python - 如何在 Wavenet 的 Keras 实现中准备输入以进行时间序列预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62317900/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com