LSTM Keras - 啥是正确的输入形状
Posted
技术标签:
【中文标题】LSTM Keras - 啥是正确的输入形状【英文标题】:LSTM Keras - What is the right input shapeLSTM Keras - 什么是正确的输入形状 【发布时间】:2020-11-27 15:14:48 【问题描述】:实际上,我正在尝试在 Keras 和 Tensorflow 中构建 LSTM 模型。我的数据集有大约 3200 个项目,具有 4 个特征和 3 个标签。
X Shape: (3200, 4)
Y Shape: (3200, 3)
如果我想要大约 5 次步骤,那么我是否必须像这样重塑:
n_time_steps= 5
n_features = 4
X_train = X_train.reshape((-1, n_time_steps, n_features))
所以我得到了这些形状:
X Shape: (640, 5, 4)
Y Shape: (3200, 3)
我有点困惑,因为 640 =! 3200 个数据点......但模型编译和拟合没有任何错误。但是 acc 和 loss 是疯狂的。
当我也尝试重塑 Y_train Y Shape: (640, 5, 3)
throws
不兼容的形状:[10,3] 与 [10,5,3] [[节点子(定义于:12)]] [操作:__inference_train_function_74818 函数调用栈: train_function
这是我的模型
opt = 'adam'
model = keras.Sequential()
model.add(layers.LSTM(128, input_shape=(n_time_steps,4)))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(3 ,activation="sigmoid"))
model.compile(optimizer=opt,loss=hn_multilabel_loss,metrics=['accuracy','mae'])
model.summary()
history = model.fit(X_train, Y_train,batch_size = 10, epochs=10, validation_split = 0.1)
有人知道如何创建一个具有 5 个时间步长和 4 个特征的 LSTM 吗?什么是正确的输入和输出形状?
谢谢大家!
【问题讨论】:
【参考方案1】:您可以使用此函数将 2D 数据集转换为具有可自定义时间步数的数据集:
def multivariate_data(dataset, target, start_index, end_index, history_size,
target_size, step, single_step=False):
data = []
labels = []
start_index = start_index + history_size
if end_index is None:
end_index = len(dataset) - target_size
for i in range(start_index, end_index):
indices = range(i-history_size, i, step)
data.append(dataset[indices])
if single_step:
labels.append(target[i+target_size])
else:
labels.append(target[i:i+target_size])
return np.array(data), np.array(labels)
我成功完成了你的任务(我简化了一点):
import tensorflow as tf
import numpy as np
from tensorflow.keras import layers
X_train = np.random.rand(3200, 4)
y_train = np.random.randint(0, 2, (3200, 3))
def multivariate_data(dataset, target, start_index, end_index, history_size,
target_size, step, single_step=False):
data, labels = [], []
start_index = start_index + history_size
if end_index is None:
end_index = len(dataset) - target_size
for i in range(start_index, end_index):
indices = range(i-history_size, i, step)
data.append(dataset[indices])
if single_step:
labels.append(target[i+target_size])
else:
labels.append(target[i:i+target_size])
return np.array(data), np.array(labels)
X_train, y_train = multivariate_data(X_train, y_train, 0, 3200, 5, 0, 1, True)
n_time_steps, n_features = 5, 4
model = tf.keras.Sequential()
model.add(layers.LSTM(128, input_shape=(n_time_steps,4)))
model.add(layers.Dense(3))
model.compile(optimizer='adam',loss='mae')
history = model.fit(X_train, y_train, batch_size = 10, epochs=1)
输出:
10/3195 [..............................] - ETA: 16:12 - loss: 0.3244
120/3195 [>.............................] - ETA: 1:19 - loss: 0.2725
230/3195 [=>............................] - ETA: 40s - loss: 0.2536
330/3195 [==>...........................] - ETA: 27s - loss: 0.2545
440/3195 [===>..........................] - ETA: 20s - loss: 0.2597
【讨论】:
感谢您的帮助。也许我做错了什么,但我的输出有 3 个标签?我无法适应 3200 个数据集。输出是关于例如的输出向量。 [0,0,1] 或 [1,0,1]。所以我会得到大约 3* 3200 = 9600 个数据集。我的意思是 4 个功能有 3 个标签。 我用 3 个标签编辑了我的示例。该函数会处理它,您不会得到 9600 个标签。 感谢您的帮助。它现在正在工作。最后!谢谢你:)以上是关于LSTM Keras - 啥是正确的输入形状的主要内容,如果未能解决你的问题,请参考以下文章
Keras 功能 api 输入形状错误,lstm 层收到 2d 而不是 3d 形状
理解 LSTM 中的输入和输出形状 | tf.keras.layers.LSTM(以及对于return_sequences的解释)