python - LSTM:了解时间步长、样本和特征,尤其是在 reshape 和 input_shape 中的使用

标签 python keras lstm

我正在尝试学习 LSTM。已经参加了这个网络类(class),阅读了这本书(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 中的使用。在我看过的许多代码示例中,它们只是使用数字而不是定义的变量,这使得理解正在发生的事情变得非常困难,尤其是当您想更改某些内容时。例如,在我参加的一门类(class)中, reshape 是这样编码的……

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

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

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

ValueError: cannot reshape array of size 434 into shape (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())

谁能解释一下我做错了什么?

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

最佳答案

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

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

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

Keras中的input_shape参数只有(time_steps, num_features), 更多可以引用this .

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

当你实现LSTM时,你应该非常清楚它的特征是什么,你希望模型在每个时间步读取的元素是什么。有一个非常相似的案例here一定能帮到你。例如,如果您尝试使用 t-1t-2 预测时间 t 的值,您可以选择馈送将两个值作为一个元素来预测 t,其中 (time_step, num_features)=(1, 2),或者您可以在 2 个时间步长中输入每个值,其中 (time_step, num_features)=(2, 1)

这就是我的基本理解,希望为您解释清楚。

关于python - LSTM:了解时间步长、样本和特征,尤其是在 reshape 和 input_shape 中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45435049/

相关文章:

python - 如何在数据框中的新列中添加值?

python - 一起变换图像和蒙版(Keras 示例)

tensorflow /Keras : Normalize train/test/realtime Data or how to handle reality?

tensorflow - tensorflow BasicLSTMCell中的num_units是什么?

machine-learning - Pytorch:为什么batch是默认LSTM中的第二个维度?

python - 使用 LSTM 层在 Keras 中进行预测

python - Keras - 通过测试所有可能的超参数来调整顺序模型

python - 如何 "inflate"numpy中的数组?

python - Python 子进程 PIPE 中的多个输入(使用标准输入或通信)

二元分类 - 计算每个类别的平均准确度并不等于总体准确度