gpt4 book ai didi

keras - 对如何实现时间分布的 LSTM + LSTM 感到困惑

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

在大量阅读和绘制图表之后,我想我已经提出了一个模型,我可以将其用作更多测试我需要调整哪些参数和功能的基础。但是,我对如何实现以下测试用例感到困惑(所有数字都比最终模型小几个数量级,但我想从小处着手):

  • 输入数据:5000x1 时间序列向量,分成 5 个 1000x1 的 epochs
  • 对于每个时间步,3 个 epochs 的数据将通过双向 LSTM 层的 3 个时间分布副本,每个副本将输出一个 10x1 的向量(提取 10 个特征),然后将其作为输入用于第二个双向 LSTM 层。
  • 对于每个时间步,第一个和最后一个标签被忽略,但中心标签是我们想要的。

  • example model

    这是我想出的,它确实可以编译。但是,查看 model.summary,我想我错过了一个事实,即我希望第一个 LSTM 在每个输出时间步长的 3 个输入序列上运行。我究竟做错了什么?
    model = Sequential()
    model.add(TimeDistributed(Bidirectional(LSTM(11, return_sequences=True, recurrent_dropout=0.1, unit_forget_bias=True), input_shape=(3, 3, epoch_len), merge_mode='sum'), input_shape=(n_epochs, 3, epoch_len)))
    model.add(TimeDistributed(Dense(7)))
    model.add(TimeDistributed(Flatten()))
    model.add(Bidirectional(LSTM(12, return_sequences=True, recurrent_dropout=0.1, unit_forget_bias=True), merge_mode='sum'))
    model.add(TimeDistributed(Dense(n_classes, activation='softmax')))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

    最佳答案

    由于您的问题有点困惑,我将采取以下假设。

  • 你有一个 5000 个时间步长的时间序列,每个步长有一个特征。形状 (1, 5000, 1)
  • 你的问题答案的主要部分: 你想运行一个“滑动窗口”的情况,窗口的大小等于 3000,窗口的步幅为 1000。
  • 您希望将窗口大小划分为 3 个内部时间序列,这 3 个序列中的每一个都有 1000 个步骤,每个步骤只有一个特征。这些系列中的每一个都作为独立系列进入相同的 LSTM(相当于拥有 3 个 LSTM 副本) - Shape (slidingWindowSteps, 3, 1000, 1)
  • 重要提示: 从这 3 个系列中,您需要 3 个没有长度和 10 个特征的输出。形状 (1,3,10) 。 (你的图片是 1x10,但你的文字是 10x1,我假设图片是正确的)。
  • 您希望将这 3 个输出合并为 3 个步骤的单个序列,形状为 (1,3,10)
  • 您希望处理这个 3 步序列的 LSTM 也返回一个 3 步序列

  • 为滑动窗口情况做准备:

    在滑动窗口的情况下,重复数据是不可避免的。您需要首先处理您的输入。

    取初始时间序列 (1,5000,1) ,我们需要将它分成一组包含 3 组 1000 个样本的批次。这里我只对 X 执行此操作,您将必须对 Y 执行类似的操作
    numberOfOriginalSequences = 1
    totalSteps = 5000
    features = 1

    #example of original input with 5000 steps
    originalSeries = np.array(
    range(numberOfOriginalSequences*totalSteps*features)
    ).reshape((numberOfOriginalSequences,
    totalSteps,
    features))

    windowSize = 3000
    windowStride = 1000

    totalWindowSteps = ((totalSteps - windowSize)//windowStride) + 1

    #at first, let's keep these dimensions for better understanding
    processedSequences = np.empty((numberOfOriginalSequences,
    totalWindowSteps,
    windowSize,
    features))

    for seq in range(numberOfOriginalSequences):
    for winStep in range(totalWindowSteps):
    start = winStep * windowStride
    end = start + windowSize
    processedSequences[seq,winStep,:,:] = originalSeries[seq,start:end,:]

    #now we reshape the array to transform each window step in independent sequences:
    totalSamples = numberOfOriginalSequences*totalWindowSteps
    groupsInWindow = windowSize // windowStride
    processedSequences = processedSequences.reshape((totalSamples,
    groupsInWindow,
    windowStride,
    features))

    print(originalSeries)
    print(processedSequences)

    创建模型:

    关于您添加的第一个图层的一些评论:
  • 模型只考虑一个 input_shape 。这个形状是 (groupsInWindow,windowStride,features) 。它应该在最外部的包装器中:TimeDistributed。
  • 您不想保留 1000 个时间步长,您只需要 10 个结果特征: return_sequences = False 。 (如果你想要更多层,你可以在第一阶段使用许多 LSTM。在这种情况下,第一个可以保留步骤,只有最后一个需要使用 return_sequences=False )
  • 你想要 10 个特征,所以 units=10

  • 我将使用函数式 API 来查看摘要中的输入形状,这有助于理解事物。
    from keras.models import Model

    intermediateFeatures = 10

    inputTensor = Input((groupsInWindow,windowStride,features))

    out = TimeDistributed(
    Bidirectional(
    LSTM(intermediateFeatures,
    return_sequences=False,
    recurrent_dropout=0.1,
    unit_forget_bias=True),
    merge_mode='sum'))(inputTensor)

    此时,您已经消除了 1000 个时间步。由于我们使用了 return_sequences=False ,因此不需要扁平化或类似的东西。数据已经形成 (samples, groupsInWindow,intermediateFeatures) 形式。 Dense 层也不是必需的。但如果你想按照你的方式去做,就不会“错”,只要最终的形状是一样的。
    arbitraryLSTMUnits = 12
    n_classes = 17

    out = Bidirectional(
    LSTM(arbitraryLSTMUnits,
    return_sequences=True,
    recurrent_dropout=0.1,
    unit_forget_bias=True),
    merge_mode='sum')(out)

    out = TimeDistributed(Dense(n_classes, activation='softmax'))(out)

    如果您要丢弃边框,则可以添加此图层:
    out = Lambda(lambda x: x[:,1,:])(out) #model.add(Lambda(lambda x: x[:,1,:]))

    完成模型:
    model = Model(inputTensor,out)
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    model.summary()

    以下是维度在此模型中的流动方式。
    我放在这里的第一个维度( totalSamples )在 None 中显示为 model.summary()
  • 输入:(totalSamples,groupsInWindow,windowStride,features)
  • 时间分布式 LSTM 的工作原理如下:
  • TimeDistributed 允许第四维,即 groupsInWindow
    这个维度将被保留。
  • 带有 return_sequences=False 的 LSTM 将消除 windowStride 并更改特征( windowStride ,倒数第二个维度,位于此 LSTM 的时间步长位置):
  • 结果:(totalSamples, groupsInWindow, intermadiateFeatures)
  • 另一个LSTM,没有时间分布,不会有第4维。这样,groupsInWindow(倒数第二个)将是“时间步长”。但是 return_sequences=True 不会像第一个 LSTM 那样消除时间步长。结果:(totalSamples, groupsInWindow, arbitraryLSTMUnits)
  • 最后的 Dense 层,因为它接收一个 3D 输入,将把第二个维度解释为一个 TimeDistributed 并保持不变,只将自身应用于特征维度。结果:(totalSamples, groupsInWindow, n_classes)
  • 关于keras - 对如何实现时间分布的 LSTM + LSTM 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46859712/

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