制作有状态 LSTM 时出现 InvalidArgumentError

InvalidArgumentError when making a stateful LSTM

我正在研究一个有状态的 LSTM 来预测股票价格。

这些是我的输入数据的形状:(更新)

x_train = (10269, 300, 89)
y_train = (10269, 1)
x_test = (4401, 300, 89)
y_test = (4401, 1)

这是我的模型初始化:

batch_size = 63
timesteps = x_train.shape[1]
data_dim = x_train.shape[2]

model = Sequential()

model.add(LSTM(32, return_sequences=True, batch_input_shape=(batch_size, timesteps, data_dim), stateful=True))
model.add(LSTM(32, return_sequences=True, stateful=True))
model.add(LSTM(32, stateful=True))

model.add(Dense(1))

model.compile(optimizer = 'adam', loss = 'mean_squared_error')

但是当我安装这个时,我得到了错误:

InvalidArgumentError:    Specified a list with shape [64,89] from a tensor with shape [29,89]
 [[{{node TensorArrayUnstack/TensorListFromTensor}}]]
 [[sequential/lstm/PartitionedCall]] [Op:__inference_train_function_6536]

据我所知,我已经正确定义了 batch_input_shape,没有发现我做错了什么。

编辑:

有些人建议我尝试让我的样本大小可以被我的批量大小整除。我试过了,但得到了同样的错误。

(如上所示,我更新了训练和测试大小)

我的新批量大小是 63,我的数据大小是 10269。10269/63 = 163。这是错误:

InvalidArgumentError:    Specified a list with shape [63,89] from a tensor with shape [54,89]
 [[{{node TensorArrayUnstack/TensorListFromTensor}}]]
 [[sequential_1/lstm_3/PartitionedCall]] [Op:__inference_test_function_20179]

使用有状态 LSTM 时,您的输入必须能被批量大小整除。

你的情况 3697 // 64 不是整数。

由于 3697 是素数,您需要删除一个样本使您的输入大小为 3696。当您有 3696 个样本时,根据(模型定义保持不变)更改代码:

batch_size = 33 # some number that divides your samples evenly.
timesteps = x_train.shape[1]
data_dim = x_train.shape[2]

model.fit(x_train, y_train, batch_size = batch_size, ...)

此问题与 stateful 参数有关。使用时,样本数要能被样本数整除。

在你的例子中,你有 3697 个不能被 64 整除的样本。

所以你可以做的是删除 49 个样本并只取 3648 个样本,因为 3648 可以被 64 整除。

验证数据的样本数也是如此。您必须将其更改为可被批量大小整除的数字。

其次,使用: model.fit(x_train, y_train, batch_size=batch_size,validation_data=(x_val,y_val))

如果您不想从数据集中删除任何样本,您可以使用数据生成器,如图所示here