关于Keras RNN输入形状要求的困惑

9

我已阅读了很多有关此问题的帖子。它们互相矛盾,每个答案似乎都有不同的解释,所以我想根据我对它们的分析来提问。

正如Keras RNN文档所述,输入形状始终为这种形式(batch_size, timesteps, input_dim)。我有点困惑,但我猜,不确定,input_dim始终为1,而timesteps取决于您的问题(也可能是数据维度)。这大致正确吗?

提出这个问题的原因是,当我尝试将input_dim的值更改为我的数据集维度时(因为input_dim听起来像这样!!),我总是会遇到错误。因此,我假设input_dim代表LSTM在某一时刻的输入向量的形状。我又错了吗?

C = C.reshape((C.shape[0], C.shape[1], 1))
tr_C, ts_C, tr_r, ts_r = train_test_split(C, r, train_size=.8)
batch_size = 1000

print('Build model...')
model = Sequential()

model.add(LSTM(8, batch_input_shape=(batch_size, C.shape[1], 1), stateful=True, activation='relu'))
model.add(Dense(1, activation='relu'))

print('Training...')
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(tr_C, tr_r,
          batch_size=batch_size, epochs=1,
          shuffle=True, validation_data=(ts_C, ts_r))

谢谢!


1
我认为你的问题不太清楚,如果你有源代码和实际的错误信息,应该在你的问题中包含它们。仅仅说有一个错误是不够的。 - Dr. Snoopy
正如Matias所建议的那样,请展示一下你遇到错误的相关代码,这样我们才能更好地帮助你,而不是继续提问。 - DarkCygnus
@MatiasValdenegro 谢谢。帖子已更新。 - Kristofer
@Kris,你能同时添加你遇到的错误吗? - DarkCygnus
1个回答

9

input_dim 是在某个时间点输入向量的形状。换句话说,input_dim 是输入特征的数量。

它不一定是1。如果您正在处理多个变量,则可以是任何数字。

假设你有10个序列,每个序列有200个时间步,你只测量温度。那么你就有一个特征:

  • input_shape = (200,1) -- 注意这里忽略了批次大小(序列数)
  • batch_input_shape = (10,200,1) -- 只有在特定情况下,例如 stateful=True,您才需要批输入形状。

现在假设你不仅测量温度,还测量压力和体积。现在你有三个输入特征:

  • input_shape = (200,3)
  • batch_input_shape = (10,200,3)

换句话说,第一维是不同序列的数量。第二位是序列长度(时间上的测量数)。最后一位是每个时间点的变量数量。


太好了!非常感谢。说到序列的长度,将其设置为每个序列的特征数是合理的吗?在我的问题中,每个样本(序列)包含64个特征,这些特征形成了一个10K行64列的矩阵! - Kristofer
1
这是一个时间序列吗?我会说它是(1, 10k, 64)。 "时间"是中心维度。 "特征"是独立变量。 我假设您每次都在测量这64个变量,对吗? - Daniel Möller
1
是的,正如我所说,我的数据集与任何普通数据集几乎相同。它有10K个样本,每个样本有64个特征。我想将每个样本视为一个序列,然后将它们馈送到RNN中。就这样。顺便说一句,(1, 10k, 64)不起作用。它应该是(10K, 64, 1) - Kristofer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接