【问题标题】:LSTM with high sequence length (Tensorflow and Keras)具有高序列长度的 LSTM(Tensorflow 和 Keras)
【发布时间】:2021-07-22 02:04:39
【问题描述】:

我目前在使用 Tensorflow 和 LSTM 时遇到了一个大问题,并且找不到解决方案:

我想使用一个大序列长度 = 100 的 LSTM。 对于我有这个配置的模型:

model.add(Masking(mask_value=0.0, input_shape=(1, x.shape[1])))
model.add(LSTM(10))
model.add(Dense(1))

我的输入 x(带有 4 个独立的输入变量)是一个具有特定长度且具有标准化值的数组... 这些列是每个独立的输入变量: 这里是前 3 行

array([[-0.82425835, -0.58544026,  1.51368749, -1.00692614],
       [-0.82227587, -0.58777757,  1.51125719, -1.00782088],
       [-0.82254579, -0.57388769,  1.50873596, -1.00916302],
...
       ]])

输出 y,或者假设要预测的变量是另一个自变量。 现在我有它在这个特定的形状/数据类型:

array([[-0.43949472],
       [-0.43949472],
       [-0.43949472],
    ...]])

到目前为止,我使用的是 Keras 预处理功能:

dataset = keras.preprocessing.timeseries_dataset_from_array(x, y, sequence_length=1, sampling_rate=1, batch_size=128)

对于 sequence_length=1,一切都使用 fit 命令运行:

history = model.fit(dataset, epochs=1000, callbacks=sel_callback)

现在我想使用 LSTM,就像我认为应该使用的那样,序列长度更长,为 100。 如果我只是更改 Keras 预处理函数中的 sequence_length 选项,一切都会开始,Tensorflow 告诉我,我有很高的准确度,例如0.03 但最后的输出看起来完全错误! 我是否必须以不同的方式预处理数据?! (对于序列长度=1,它工作正常...)


另外,如果我想添加另一个 LSTM,例如:

model.add(Masking(mask_value=0.0, input_shape=(1, x.shape[1])))
model.add(LSTM(10,  return_sequences=True))
model.add(LSTM(10))
model.add(Dense(1))

然后我得到一个错误,模型根本不工作......使用sequence_length=1 添加第二个 LSTM 工作?

错误看起来像这样:

File "...\tensorflow\python\eager\execute.py", line 59, in quick_execute
    tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
tensorflow.python.framework.errors_impl.InvalidArgumentError:    Operation expected a list with 1 elements but got a list with 2 elements.
         [[{{node gradients/TensorArrayUnstack/TensorListFromTensor_grad/TensorListStack}}]]
         [[PartitionedCall]] [Op:__inference_train_function_13514]

Function call stack:
train_function -> train_function -> train_function

所以我的问题:

  • 我是否必须以不同的方式准备具有高序列长度的数据?还是我有其他我没有找到的问题?
  • 为什么我在更改我的 sequence_length>1 时不能添加第二层??

非常感谢!!

【问题讨论】:

    标签: python tensorflow keras neural-network lstm


    【解决方案1】:

    我认为准备具有更高序列长度的数据没有问题(尽管 100 似乎并不高)。您可以更改您的模型 model.add(Masking(mask_value=0.0, input_shape=(None, x.shape[1]))),因此您不必为不同的序列长度值更改 input_shape。
    当你说:

    Tensorflow 告诉我,我的准确率很高,例如0.03

    您是指均方误差(例如),而不是准确性?这是一个回归问题。
    我用合成数据复制了你的问题,添加第二个 LSTM 不是问题。然而,更复杂的模型在依赖关系方面对应于更复杂的数据。据我了解,在您的数据集中,所有变量都是独立的。当您尝试进行预测时,这可能是一个问题...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 2018-04-17
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多