Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python LSTM:了解时间步、样本和特征,尤其是在重塑和输入形状中的使用_Python_Keras_Lstm - Fatal编程技术网

Python LSTM:了解时间步、样本和特征,尤其是在重塑和输入形状中的使用

Python LSTM:了解时间步、样本和特征,尤其是在重塑和输入形状中的使用,python,keras,lstm,Python,Keras,Lstm,我正在努力学习LSTM。我参加过这个网络课程,读过这本书()和很多博客。。。但是,我完全被卡住了。我对多元LSTM感兴趣,我已经读了所有我能找到的东西,但仍然不能得到它。不知道我是不是很蠢或者是什么 如果这个确切的问题和一个好的答案已经存在,那么我很抱歉重复发帖,但我已经查找了,没有找到它… 由于我想真正了解基本知识,我在excel中创建了一个虚拟数据集,其中每个“y”取决于每个输入x1和x2的总和,但也随时间而变化。据我所知,这是一个多对一的场景。 伪代码: x1(t) = sin(A(t))

我正在努力学习LSTM。我参加过这个网络课程,读过这本书()和很多博客。。。但是,我完全被卡住了。我对多元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)

我还没有真正掌握的是时间步长和采样的确切含义,以及在重塑和输入形状中的用途。在我看过的许多代码示例中,它们只是使用数字而不是定义的变量,这使得理解正在发生的事情非常困难,特别是如果您想要更改某些内容。作为一个例子,在我参加的一门课程中,重塑是这样编码的

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())
谁能解释一下我做错了什么

正如我所说,我读过很多博客、问题、教程等,但如果有人有特别好的信息来源,我也很乐意去查一下。

这对我很有帮助

但很快,你的问题的答案是: 您想将包含434元素的列表重塑为形状(217,3,2),但这是不可能的,让我告诉您原因:


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

您似乎对LSTM的期望有了相当的了解,并且正在努力将数据转换为正确的格式。您从形状
(217,2)
X\u序列开始,并希望对其进行重塑,使其位于形状
(注意,样本,回望,数量特征)
。您已经定义了
look\u back
num\u功能
,实际上剩下的所有工作都是使用原始
X\u序列生成
nb\u样本
长度块
look\u back
。Numpy的重塑并不是真正的工具,相反,您必须编写一些代码

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\u测试和
y\u测试做同样的事情

我以前也有过这个问题。在更高的层次上,在
(示例、时间步、功能)

  • samples
    是数据的数量,或者说数据集中有多少行
  • time step
    是输入模型的次数或
    LSTM
  • features
    是每个样本的列数
  • 对我来说,我认为更好的例子是,在
    NLP
    中,假设你要处理一个句子,那么这里的示例是1,这意味着要阅读一个句子,
    时间步长是该句子中的字数,在模型读取所有单词并获得该句子的整个上下文之前,逐字输入句子,
    功能
    这里是每个单词的维度,因为在像
    word2vec
    手套
    这样的单词嵌入中,每个单词都由一个具有多个维度的向量来解释

    Keras
    中的
    input\u shape
    参数仅为
    (时间步长、数值特征)
    , 更多你可以参考

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

    当您实施
    LSTM
    时,您应该非常清楚您希望模型在每个时间步读取的功能和元素。有一个非常相似的案例肯定可以帮助你。例如,如果您试图使用
    t-1
    t-2
    预测时间
    t
    的值,您可以选择输入两个值作为一个元素来预测
    t
    ,其中
    (时间步长,数值特征)=(1,2)
    ,或者您可以在两个时间步长中输入每个值,其中
    (时间步长,数值特征)=(2,1)


    我基本上就是这样理解的,希望你能明白。

    太棒了!谢谢你,妮可。成功了!结果表明,LSTM完成了我所希望的工作。知道如何在一个模型周围工作可以让我开始为一些更有用的东西建模。@Nicole White:很好的解决方案!因此,当选择
    y\u列[y\u位置]
    时,您将拥有
    y\u整形[0]=y[3],y\u整形[1]=y[4]…
    。因此,您正在删除
    y\u列
    数组的第一个值,对吗?