LSTM:了解时间步,样本和功能,尤其是在重塑和input_shape中的用途

DBS*_*BSE 5 python lstm keras

我正在尝试学习LSTM。学习了本网络课程,阅读了这本书(https://machinelearningmastery.com/lstms-with-python/)和许多博客...但是,我完全陷入困境。我对多元LSTM感兴趣,我已经阅读了所有可以找到但仍然无法获得的信息。不知道我是愚蠢的还是什么...

如果这个确切的问题和好的答案已经存在,那么我很抱歉重复发布,但是我已经查找并没有找到它...

正如我想真正了解基本知识一样,我在excel中创建了一个虚拟数据集,其中每个“ y”都取决于每个输入x1和x2的总和,而且还取决于时间。据我了解,这是多对一的情况。伪代码:

x1(t) = sin(A(t))
x2(t) = cos(A(t))
tmp(t) = x1(t) + x2(t)         (dummy variable)
y(t) = tmp(t) + tmp(t-1) + tmp(t-2)     (i.e. sum over the last three steps)
Run Code Online (Sandbox Code Playgroud)

(基本上我想在三个时间步长上给定x1和x2来预测y(t))

然后将其导出到具有x1,x2,y列的csv文件

我试图将其编码在下面,但显然无法正常工作。

我读取数据并将其拆分为80/20测试和训练集,并将其设置为尺寸为(217,2),(217,1),(54,2),(54/1)的X_train,y_train,X_test,y_test

我真正还没有掌握的是时间步长和样本以及reshape和input_shape中的用法。在许多代码示例中,我查看了它们仅使用数字而不是定义的变量,这使您很难理解正在发生的事情,尤其是如果您要更改某些内容。例如,在我参加的其中一门课程中,重塑是这样编码的...

X_train = np.reshape(X_train, (1257, 1, 1))
Run Code Online (Sandbox Code Playgroud)

这没有提供太多信息...

无论如何,当我运行下面的代码时,它说

ValueError:无法将大小为434的数组重塑为形状(217,3,2)

因此,我知道导致错误的原因,但不知道解决该错误的方法。如果我设置look_back = 1可以工作,但这不是我想要的。

import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense

# Load data
data_set = pd.read_csv('../Data/LSTM_test.csv',';')
"""
data loaded have three columns:
    col 0, col 1: features (x)
    col 2: y
"""

# Train/test and variable split
split = 0.8 # 80% train, 20% test
split_idx = int(data_set.shape[0]*split)

# ...train
X_train = data_set.values[0:split_idx,0:2]
y_train = data_set.values[0:split_idx,2]

# ...test
X_test = data_set.values[split_idx:-1,0:2]
y_test = data_set.values[split_idx:-1,2]

# Model setup
look_back = 3 # as that is how y was generated (i.e. sum last three steps)
num_features = 2 # in this case: 2 features x1, x2
output_dim = 1 # want to predict 1 y value

nb_hidden_neurons = 32 # assume something to start with
nb_epoch = 2 # assume something to start with

# Reshaping
nb_samples = len(X_train) # in this case 217 samples in the training set
X_train_reshaped = np.reshape(X_train,(nb_samples, look_back, num_features))

# Create model
model = Sequential()
model.add(LSTM(nb_hidden_neurons, input_shape=(look_back,num_features)))
model.add(Dense(units=output_dim))
model.compile(optimizer = 'adam', loss = 'mean_squared_error')

model.fit(X_train_reshaped, y_train, batch_size = 32, epochs = nb_epoch)
print(model.summary())
Run Code Online (Sandbox Code Playgroud)

谁能解释我做错了什么?

正如我所说,我已经阅读了很多博客,问题,教程等,但是如果某人有特别好的信息来源,我也希望对其进行检查。

MJe*_*emy 8

我之前也有这个问题。在更高的层面上,在(samples, time steps, features)

  1. samples 是数据的数量,或者说你的数据集中有多少行
  2. time step 是输入模型的次数或 LSTM
  3. features 是每个样本的列数

对我来说,我认为一个更好的例子来理解它是NLP,假设你有一个句子要处理,那么这里的样本是 1,这意味着要阅读 1 个句子,time step是该句子中的单词数,你输入句子在模型逐字读取所有单词并获得该句子的整个上下文之前,features这里是每个单词的维度,因为在像word2vecor这样的词嵌入中glove,每个单词都由多维向量解释。

input_shapein的参数Keras只有一个(time_steps, num_features),更多可以参考这个

而你的问题是,当你对数据进行整形时,每个维度的乘积应该等于原始数据集维度的乘积,其中434不等于217*3*2。

当您实施 时LSTM,您应该非常清楚您希望模型在每个时间步中读取哪些功能以及哪些元素。有一个非常相似的情况下,在这里一定可以帮助你。例如,如果您尝试t使用t-1和来预测时间值t-2,您可以选择将两个值作为一个元素提供给 predict t, where (time_step, num_features)=(1, 2),或者您可以在 2 个时间步长中提供每个值, where (time_step, num_features)=(2, 1)

这就是我的基本理解,希望你能说清楚。


Nic*_*ite 5

您似乎对LSTM的期望掌握得很好,并且正努力将数据转换为正确的格式。您先从一个X_train形状开始,(217, 2)然后想要对其进行重塑,使其形状为(nb_samples, look_back, num_features)。您已经定义了look_backnum_features实际上剩下的所有工作都是使用原始代码生成nb_samples长度很大的块。Numpy的重塑并不是真正的工具,相反,您必须编写一些代码。look_backX_train

import numpy as np

nb_samples = X_train.shape[0] - look_back

x_train_reshaped = np.zeros((nb_samples, look_back, num_features))
y_train_reshaped = np.zeros((nb_samples))

for i in range(nb_samples):
    y_position = i + look_back
    x_train_reshaped[i] = X_train[i:y_position]
    y_train_reshaped[i] = y_train[y_position]

model.fit(x_train_reshaped, y_train_reshaped, ...)
Run Code Online (Sandbox Code Playgroud)

现在的形状是:

x_train_reshaped.shape
# (214, 3, 2)

y_train_reshaped.shape
# (214,)
Run Code Online (Sandbox Code Playgroud)

你必须做同样的事情X_testy_test