Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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 Keras LSTM似乎在拟合时间序列输入的末尾,而不是预测目标_Python_Keras_Time Series_Lstm_Prediction - Fatal编程技术网

Python Keras LSTM似乎在拟合时间序列输入的末尾,而不是预测目标

Python Keras LSTM似乎在拟合时间序列输入的末尾,而不是预测目标,python,keras,time-series,lstm,prediction,Python,Keras,Time Series,Lstm,Prediction,在此之前,我对python有丰富的经验,对构建和使用机器学习网络也有一定的经验。这就是说,这是除了一些可用的cookie-cuter示例之外,我制作的第一个LSTM,因此非常感谢您的帮助。我觉得这是一个简单解决方案的问题,我只是看了这个代码太久了,看不到它 该模型是在python3.5 venv中使用Keras和tensorflow后端制作的 简而言之,我试图使用数据本身以及这些数据的一些数学排列来预测一些时间数据,创建四个输入特征。我正在根据之前的60个数据点构建一个时间序列输入,并将预测目标

在此之前,我对python有丰富的经验,对构建和使用机器学习网络也有一定的经验。这就是说,这是除了一些可用的cookie-cuter示例之外,我制作的第一个LSTM,因此非常感谢您的帮助。我觉得这是一个简单解决方案的问题,我只是看了这个代码太久了,看不到它

该模型是在python3.5 venv中使用Keras和tensorflow后端制作的

简而言之,我试图使用数据本身以及这些数据的一些数学排列来预测一些时间数据,创建四个输入特征。我正在根据之前的60个数据点构建一个时间序列输入,并将预测目标指定为未来的60个数据点

完整训练数据的形状(输入)(目标):(2476224,60,4)(2476224)

单个数据“点”(输入)(目标)的形状:(1,60,4)(1)

似乎正在发生的是,经过训练的模型拟合了我输入时间序列的后续值(当前值),而不是我提供的目标值(未来60个周期)

有趣的是,损失函数似乎是根据正确的预测目标计算的,但模型并未收敛到正确的解

我不知道模型为什么要这样做。我的第一个想法是,我对数据进行了错误的预处理,并将其提供给了错误的目标。我已经对数据的输入格式进行了广泛的测试,并且非常有信心为模型提供了正确的目标和输入信息

在一个例子中,我稍微提高了学习速度,使得模型收敛到局部极小值。这种收敛性的测试损失与我首选学习率的损失非常相似(仍然很高)。但这些预测仍然是“当前值”。为什么会这样

以下是我创建模型的方式:

def create_model():
lstm_模型=顺序()
lstm_model.add(CuDNNLSTM(100,批次输入形状=(批次大小、时间步长、序列输入形状[2]),
stateful=True,return\u sequences=True,
内核(初始化器='random_uniform'))
lstm_模型添加(辍学率(0.4))
lstm_模型添加(CuDNNLSTM(60))
lstm_模型添加(辍学率(0.4))
lstm_model.add(稠密(20,activation='relu'))
lstm_model.add(稠密(1,激活='linear'))
optimizer=optimizers.Adagrad(lr=params[“lr”])
lstm_model.compile(loss='mean_squared_error',optimizer=optimizer)
返回lstm_模型
这就是我对数据进行预处理的方式。第一个函数build_timeseries构造我的输入输出对。我相信这是正确的(但请纠正我,如果我错了)。第二个函数修剪这些对以适应批量大小。我对测试输入/目标执行完全相同的操作

train\u input,train\u target=构建时间序列(train\u input,time\u step,pred\u horiz,0)
列车输入=修剪数据集(列车输入,批量大小)
序列目标=修剪数据集(序列目标、批次大小)
def build_timeseries(mat、TIME_STEPS、PRED_HORIZON、y_col_index):
#y_col_index是用作输出列的列的索引
dim_0=mat.shape[0]#num数据集
尺寸1=材料形状[1]#数量特征
尺寸2=材料形状[2]#数量数据点
#重新格式化的矩阵
垫=垫交换垫(1,2)
x=np.0((尺寸0*(尺寸2-PRED_地平线),时间步长,尺寸1))
y=np.0((零点0*(零点2-前地平线)))
k=0
对于范围内的i(dim_0):#遍历数据集
对于范围内的j(时间步长,尺寸2-PRED\u地平线):
x[k]=mat[i,j-时间步长:j]
y[k]=mat[i,j+PRED_HORIZON,y_col_index]
k+=1
打印(“时间序列i/o的长度”,x形,y形)
返回x,y
def trim_数据集(材料、批次大小):
无行数下降=材料形状[0]%批量大小
如果(没有行数\u下降>0):
返回垫[no_of_rows\u drop:]
其他:
回程垫
最后,这是我如何称呼实际模型的

history=model.fit(训练输入,训练目标,epochs=params[“epochs”],verbose=2,batch\u size=batch\u size,
shuffle=True,验证数据=(测试输入,测试目标),回调=[es,mcp])

当模型收敛时,我希望它预测的值接近我输入的指定目标。然而,它的预测与时间序列数据的后续值(或当前值)更为接近。然而,另一方面,该模型似乎是根据指定的目标来评估损失。。。。为什么它是这样工作的,我如何修复它?非常感谢您的帮助。

您不需要在其他层中也设置return\u sequences=true吗?您不需要在其他层中也设置return\u sequences=true吗?