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

input data shapes & sizes, RNN Keras, regression

我无法使用 Keras 将我的数据排序为适用于 RNN 的正确格式。 我有一个包含 22 列、1344 行的 csv 文件。 我的数据是数周内以 30 分钟为间隔记录的连续变量。

我知道 keras 需要输入格式 (num samples, timesteps, 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,) 的数组。

我不确定我是否已完全理解嵌入层或(num samples.timesteps,nfeatures)的含义。 有人可以参考我的数据解释input_dim、input_length和output_dim的含义吗?我阅读了许多关于此问题的其他帖子,但似乎无法解决将问题应用于我的数据类型的问题!

非常感谢您的帮助。

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

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

对于input_shape,分为三部分:

input_shape (1,48,22) => 批量大小 = 1,时间步长 = 48,输入特征大小 = 22。

批量大小是可选的。 'time-steps' 是您想使用多少个过去的时间点来进行预测。在下面的示例中,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)

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

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