【问题标题】:How to correctly specify input shape for a Keras LSTM model如何正确指定 Keras LSTM 模型的输入形状
【发布时间】:2023-03-29 01:29:01
【问题描述】:

我有一个生成器,可以生成我的 x 和 y,这是我用来在 Keras 中训练我的 LSMT 模型的。

X 的格式为 [0.0, 1.0, 0.0004]。

我之前设置了这个数据的形状:

x_out = np.array(list(x_drop.values())).reshape(len(x_drop), 1)
y_out = np.array([y])

我得到一个异步生成器,然后我传入一个同步函数,然后使用 model.fit_generator():

train_gen = to_sync_generator(replay(traintime_0, traintime_1, test=0))
    model = lstm_model()

model.fit_generator(
    train_gen,
    epochs = 5,
    verbose = 1,
    steps_per_epoch=500,
    initial_epoch=0,
    validation_data=valid_gen,
    validation_steps=500)

我的型号代码如下。

   def lstm_model():
       model = Sequential()
       model.add(LSTM(100, input_shape=(3,1)))
       model.add(Dense(1))
       model.compile(loss='mean_squared_error', optimizer='adam')
       return model

我收到以下错误:

ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (3, 1)

注意,我无法预处理这些数据。

我还没有真正看到将 lstm 用于非预处理数据的示例,非常感谢任何建议!谢谢。

【问题讨论】:

  • 您能发布与您的数据管道相关的代码吗?
  • 当然可以。

标签: python keras generator lstm


【解决方案1】:

您的数据必须是使用格式 (x, y, z) 的元组,其中 => x 是您的批号(您最初可以从 1 开始),y 是您的数据数组,z 是您的数据形状。 根据你的情况,我可以推断出你的数据有一个特征,有 3 个步骤。因此,您可以使用以下代码进行准备:

data = data.reshape((1, 3, 1))

如果不能直接改变数据,可以合并成一个新数组,然后把数组拟合到模型中

【讨论】:

  • 抱歉,我猜我的代码不清楚,我的 train_gen 返回一个 X,Y 元组,格式为:([0.0, 1.0, 0.0004], 0.25)。所以有 3 个功能,1 个步骤。这意味着我应该重塑为 (1, 1, 3)?
  • 但请记住它不能正常工作,因为你只有一个单元格/时间步长(在 LSTM 中,每个时间步长都作为一个单元格工作,这是你首先要利用的)
  • 为什么不能正常工作?我的回溯窗口是 100 个周期,但我一次只喂 1 个批次。他们不应该有关系吗?
  • 您并没有充分发挥 LSTM 的潜力,事实上,您使用它的方式(每批次一个时间步)使您的 RNN 像 ANN 一样工作(LSTM 从连接中受益时间步长之间)。你可以在这里阅读更多信息:colah.github.io/posts/2015-08-Understanding-LSTMs
  • 你使用时间步来展示信息每次是如何演变的,你需要至少两个信息单元(两个时间步)来利用它
猜你喜欢
  • 1970-01-01
  • 2020-09-04
  • 2019-01-29
  • 2020-09-26
  • 2020-11-27
  • 2016-11-09
  • 2018-02-27
  • 2019-01-20
  • 1970-01-01
相关资源
最近更新 更多