我目前有一个在Keras中实现的简单LSTM模型,分别具有一个训练集x_train的维数(1,18227,98)和一个测试集x_test的维数(1,3217,98)时间步/特征。当前,该模型正在训练中,没有任何障碍,但是当我尝试使用测试集进行评估时,出现以下错误:
File "keras_LSTM.py", line 170, in <module>
loss, f1, precision = model.evaluate(x_test, y_test,
batch_size=batch_size)
File
"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-
packages/keras/engine/training.py", line 1102, in evaluate
batch_size=batch_size)
File
"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/keras/engine/training.py", line 751, in _standardize_user_data
exception_prefix='input')
File
"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-
packages/keras/engine/training_utils.py", line 138, in
standardize_input_data
str(data_shape))
ValueError: Error when checking input: expected lstm_1_input to have
shape (18227, 98) but got array with shape (3217, 98)
任何帮助将不胜感激-如果需要,将提供代码。还应该注意,我的输入形状是3维的-但是错误报告忽略了batch_size维,并输出了(sequence_length,feature_number)元组。
答案 0 :(得分:2)
Keras LSTM层期望输入为3个调光,例如(batch_size,seq_length,input_dims),但是您分配错误。试试这个
首先将数据重塑为: (1,18227,98)和尺寸为(1,3217,98)的测试集x_test
X_train = x_train.reshape(-1,98)
X_test = x_test.reshape(-1,98)
现在,使用选择seq_length
,我选择10。
seq_length = 10
X_train1 = []
X_test1 = []
for i in range(0, X_train.shape[0] - seq_length, 1):
X_train1.append(X_train[i:i+seq_length])
X_test1.append(X_test[i:i+seq_length])
# labels.append(labels[i+seq_length-1])
import numpy as np
X_train1 = np.reshape(X_train1, (-1, seq_length, 98))
X_test1 = np.reshape(X_test1, (-1, seq_length, 98))
现在,你很好走
input_dims = 98 # an integer
seq_length = 10 # an integer
model = Sequential()
model.add(LSTM(128, activation='relu', input_shape=(seq_length, input_dims), return_sequences=True))
您正在为模型使用单一序列,这是无效的方法。
答案 1 :(得分:0)
Ankish Bansal在小窗口中拆分长序列的想法可能是一个好方法。但是出于某种原因,您可能希望保持整个序列的连接。
在这种情况下,您应该设置input_shape=(None,98)
,这样,您的模型可以接受任何序列长度。 (假设您不使用任何Flatten
图层或其他需要固定尺寸的图层。)
但是,如果您的数据中有“多个序列”,则您应该检查所有内容,因为序列数通常应为批处理大小。