Keras的模型评估期望训练集尺寸而不是测试集尺寸

时间:2019-01-15 21:35:16

标签: tensorflow keras lstm

我目前有一个在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)元组。

2 个答案:

答案 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图层或其他需要固定尺寸的图层。)

但是,如果您的数据中有“多个序列”,则您应该检查所有内容,因为序列数通常应为批处理大小。