LSTM:了解时间步长,样本和功能,特别是在reshape和input_shape中的使用

时间:2017-08-01 10:13:22

标签: python keras lstm

我正在努力学习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)

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

然后将其导出到具有列x1,x2,y

的csv文件

我试过在下面编写代码,但显然它不起作用。

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

我真正掌握的是时间步和样本究竟是什么,以及在reshape和input_shape中使用。在许多代码示例中,我看到它们只是使用数字而不是定义的变量,这使得很难理解正在发生的事情,特别是如果你想要改变一些东西。举个例子,我在其中一个课程中重塑了这个编码......

X_train = np.reshape(X_train, (1257, 1, 1))

这不提供太多信息......

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

  

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())

任何人都可以解释我做错了吗?

正如我所说,我已经阅读了很多博客,问题,教程等,但如果有人有特别好的信息来源,我也很想检查一下。

3 个答案:

答案 0 :(得分:4)

您似乎很好地掌握了LSTM的预期,并且正在努力将您的数据转换为正确的格式。您从[{1}}形状X_train开始,并且想要重塑它,使其形状为(217, 2)。您已经定义了(nb_samples, look_back, num_features)look_back,实际上剩下的所有工作都是使用您的原始num_features生成nb_samples长度look_back的块。 Numpy的重塑不是真正的工具,而是你必须编写一些代码。

X_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, ...)

您必须使用x_train_reshaped.shape # (214, 3, 2) y_train_reshaped.shape # (214,) X_test执行相同的操作。

答案 1 :(得分:2)

我之前也有这个问题。在更高级别,(samples, time steps, features)

  1. samples是数据的数量,或者说数据集中有多少行
  2. time step是模型中提供的次数或LSTM
  3. features是每个样本的列数
  4. 对我来说,我认为一个更好的例子就是在NLP中,假设你有一个要处理的句子,那么这里的样本是1,这意味着要读一句,time step是在该句子中的单词数量,你在模型读取所有单词之前逐字逐句地输入并得到该句子的整个上下文,features这里是每个单词的维度,因为在单词嵌入中就像word2vecglove,每个字都由具有多个维度的向量解释。

    input_shape中的Keras参数仅为(time_steps, num_features), 更多你可以参考this

    你的问题是,当你重塑数据时,每个维度的乘法应该等于原始数据集的维度的乘法,其中434不等于217 * 3 * 2.

    当您实施LSTM时,您应该清楚每个时间步骤中您希望模型阅读的功能和要素是什么。有一个非常类似的案例here肯定可以帮到你。例如,如果您尝试使用tt-1预测时间t-2的值,则可以选择将两个值作为一个元素进行预测t(time_step, num_features)=(1, 2),或者您可以按(time_step, num_features)=(2, 1)的两个时间步长提供每个值。

    这基本上就是我对此的理解,希望能为你清楚。

答案 2 :(得分:1)

https://github.com/fchollet/keras/issues/2045帮助了我。

但很快,您的问题的答案: 你想重塑一个带有 434 元素的列表(217,3,2),但这是不可能的,让我告诉你原因:

新形状有217 * 3 * 2 = 1302 元素,但原始列表中有434个元素。因此,解决方案是改变整形的尺寸。