我正在开发一个有状态的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]
这个问题与stateful
参数有关。当使用它时,样本的数量应该可以被样本的数量整除。
在你的情况下,你有3697个样本,不能被64整除。
所以你可以去掉49个样本,只取3648个样本,因为3648可以被64整除。
验证数据的样本数量也是如此。你必须把它改成一个可以被批量大小整除的数字。
其次,使用:model.fit(x_train, y_train, batch_size=batch_size,validation_data=(x_val,y_val))
如果你不想从数据集中删除任何样本,你可以使用数据生成器,如所示
使用有状态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, ...)