输入数据的形状和大小,RNN Keras,回归

时间:2019-03-14 16:09:46

标签: python keras recurrent-neural-network

我无法使用Keras将数据分类为RNN的正确格式。 我有一个22列1344行的csv文件。 我的数据是连续的变量,每隔30分钟记录一次,持续数周。

我了解keras要求以以下格式输入(样本数,时间步长,nfeatures) 因此对于我的数据,我看到的是(1344,48,22) (因为我的数据在24小时内有48个读数)。

从csv导入时,x数据的形状为(1344,22)。

这是我的代码:

model=Sequential()
model.add(LSTM(21, input_shape=(1344,22),kernel_initializer='normal',activation='relu',return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(19, activation='relu')) #hidden layer 2
model.add(Dropout(0.2))
model.add(Dense(8, activation='relu')) #output layer
model.compile(loss='mean_squared_error', optimizer=optimiser,metrics=['accuracy','mse'])

这导致了错误     检查输入时出错:预期lstm_1_input具有3个维,但数组的形状为(1344,22)

我试图通过添加嵌入层将x数据转换为正确的数据。 我的代码现在显示为:

model=Sequential()
model.add(Embedding(input_dim=22,input_length=1344,output_dim=48))
model.add(LSTM(21, input_shape=(1344,22), kernel_initializer='normal',activation='relu',return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(19, activation='relu')) #hidden layer 2
model.add(Dropout(0.2))
model.add(Dense(8, activation='relu')) #output layer
model.compile(loss='mean_squared_error', optimizer=optimiser,metrics=['accuracy','mse'])
history=model.fit(x,y, verbose=0,epochs=150, batch_size=70, validation_split=0.2)

导致错误:     检查输入时出错:预期embedding_1_input具有形状(1344),但数组的形状为(22,)。

我不确定我是否已完全理解嵌入层或(数字样本,时间步长,nfeatures)的含义。 有人可以参考我的数据解释input_dim,input_length和output_dim的含义吗?香港专业教育学院阅读有关此问题的许多其他帖子,似乎无法解决将问题应用于我的数据类型的问题!

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您可以直接将数据输入LSTM,而无需使用嵌入层。

1344行=>因此,我假设22列的每一行都是在某个时间点获取的读数。

对于input_shape,分为三个部分:

input_shape(1,48,22)=>批处理大小= 1,时间步长= 48,输入功能大小= 22。

批量大小是可选的。 “时间步长”是您要用来进行预测的过去时间点。在下面的示例中,48表示将使用过去24小时的数据进行预测。因此,您必须将1344行数据重塑为如下所示:

第一个样本=第1至48行

第二个样本=第2至49行,依此类推。

model.add(LSTM(21, input_shape=(48,22),kernel_initializer='normal',activation='relu', return_sequences=True))

# Other layers remain the same as in your first code snippet

print(model.predict(np.zeros((1,48,22)))) # Feed dummy sample to network
[[0. 0. 0. 0. 0. 0. 0. 0.]]

def create_dataset(dataset, look_back):
    dataX, dataY = [], []
    for i in range(len(dataset)-look_back):
        dataX.append(dataset[i:(i+look_back)]) # all 22 columns for X
        dataY.append(dataset[i + look_back, 0:8]) # first 8 columns for Y, just as an example
    return np.array(dataX), np.array(dataY)

csv_data = np.random.randn(1344,22) # simulate csv data
X, Y = create_dataset(csv_data, 48) 
print(X.shape, Y.shape) # (1296, 48, 22) (1296, 8)
model.fit(X, Y)

余弦波预测的简单示例-易于使用.create_dataset函数来自此链接。 https://github.com/sachinruk/PyData_Keras_Talk/blob/master/cosine_LSTM.ipynb

关于重塑数据: https://machinelearningmastery.com/reshape-input-data-long-short-term-memory-networks-keras/