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

Posted

技术标签:

【中文标题】输入数据形状和大小,RNN Keras,回归【英文标题】:input data shapes & sizes, RNN Keras, regression 【发布时间】:2019-08-05 14:59:49 【问题描述】:

我无法使用 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,)。

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

非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

您可以直接将数据馈送到 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)

余弦波预测的简单示例 - 易于使用。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/

【讨论】:

谢谢!我遇到了history=model.fit(x,y, verbose=0,epochs=150, batch_size=70, validation_split=0.2) 的问题,它引发了错误expected lstm_1_input to have 3 dimensions, but got array with shape (1344, 22) 我尝试使用xshaped= np.reshape(x, (1344, 22, -1)) 重塑x 数据,尽管我的x 数据形状为(1344,22),但它给出了错误Must pass 2-d input!这种拟合方法合适吗?再次感谢 不,您使用 reshape 的方式不正确。我已经更新了答案,请检查。 示例假设过去 48 个样本用于预测 Y。Y 的值,我取了前 8 列。请根据您的用例进行相应调整。 非常感谢您的解释以及代码 sn-p

以上是关于输入数据形状和大小,RNN Keras,回归的主要内容,如果未能解决你的问题,请参考以下文章

有人可以解释使用 RNN 的回归模型的批量大小和时间步长吗?

Recurrentshop 和 Keras:多维 RNN 导致维度不匹配错误

使用 dropout (TF2.0) 时,可变批量大小不适用于 tf.keras.layers.RNN?

批量大小未传递给 tf.keras 模型:“检查输入时出错:预期 input1 有 3 个维度,但得到的数组形状为 (a,b)”

具有两种不同输入样本大小的 Keras 多任务学习

使用Tensorflow后端的Keras LSTM RNN中令人费解的训练损失与纪元...行为的任何原因