Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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
Tensorflow 使用Keras构建多变量、多任务LSTM_Tensorflow_Machine Learning_Neural Network_Keras_Lstm - Fatal编程技术网

Tensorflow 使用Keras构建多变量、多任务LSTM

Tensorflow 使用Keras构建多变量、多任务LSTM,tensorflow,machine-learning,neural-network,keras,lstm,Tensorflow,Machine Learning,Neural Network,Keras,Lstm,序言 trainX = trainingDataReshaped #Data for Product 1, Jan 2014 to Dec 2016 trainY = trainingTargetReshaped validX = validDataReshaped #Data for Product 1, for ??? Maybe for a few months? validY = validTargetReshaped numSequences = trainX.shape[0

序言

trainX = trainingDataReshaped #Data for Product 1, Jan 2014 to Dec 2016
trainY = trainingTargetReshaped
validX = validDataReshaped #Data for Product 1, for ??? Maybe for a few months?
validY = validTargetReshaped    

numSequences = trainX.shape[0]
numTimeSteps = trainX.shape[1]
numFeatures = trainX.shape[2]

numTargets = trainY.shape[2]

model = Sequential()
model.add(LSTM(100, input_shape=(None, numFeatures), return_sequences=True)) 
model.add(Dense(numTargets, activation="softmax"))    

model.compile(loss=stackEntry.params["loss"],
      optimizer="adam",
      metrics=['accuracy'])

history = model.fit(trainX, trainY,
            batch_size=30,
            epochs=20,
            verbose=1,
            validation_data=(validX, validY))               

predictX  = predictionDataReshaped #Data for Product 1, Jan 2017 to Dec 2017

prediction=model.predict(predictX)
我目前正在研究一个机器学习问题,我们的任务是使用过去的产品销售数据来预测未来的销售量(以便商店能够更好地规划库存)。我们基本上有时间序列数据,我们知道每种产品在哪一天售出了多少台。我们也有诸如天气情况、是否有公共假日、是否有任何产品在销售等信息

我们已经能够通过使用具有密集层的MLP对此进行建模,并且仅使用滑动窗口方法来包括周围几天的销售量。然而,我们相信,通过时间序列方法(如LSTM),我们将能够获得更好的结果

数据

我们掌握的基本数据如下:

编辑:为清晰起见,上图中的“时间”列不正确。我们每天输入一次,而不是每月输入一次。但除此之外,结构是相同的!)

因此,X数据的形状如下:

(numProducts, numTimesteps, numFeatures) = (50 products, 1096 days, 90 features)
(numProducts, numTimesteps, numTargets) =  (50 products, 1096 days, 3 binary targets)
Y数据的形状如下:

(numProducts, numTimesteps, numFeatures) = (50 products, 1096 days, 90 features)
(numProducts, numTimesteps, numTargets) =  (50 products, 1096 days, 3 binary targets)

因此,我们有三年(2014年、2015年、2016年)的数据,并希望在这方面进行培训,以便对2017年做出预测。(这当然不是100%正确,因为我们实际上有截至2017年10月的数据,但我们现在就忽略这一点)

问题

我想在Keras建立一个LSTM,使我能够做出这些预测。但有几个地方我被卡住了。所以我有六个具体的问题(我知道有一个应该尝试将Stackoverflow帖子限制为一个问题,但这些都是相互交织的)

首先,如何对批次的数据进行切片?既然我有整整三年的时间,那么简单地推进三批,每次一年的规模有意义吗?还是说生产小批量(比如30天)和使用滑动窗口更有意义?也就是说,我使用36*6批30天,而不是36批30天,每次5天?或者这真的不是LSTM应该使用的方式吗?(请注意,数据中有相当多的季节性因素,我也需要捕捉这种长期趋势)

其次,在这里使用
return\u sequences=True
有意义吗?换句话说,我将Y数据保持原样
(501096,3)
,以便(据我所知)在每个时间步都有一个预测,可以根据目标数据计算损失?或者我最好使用
return\u sequences=False
,这样只使用每个批次的最终值来评估损失(即,如果使用年度批次,那么在2016年,对于产品1,我们根据2016年12月的
(1,1,1)
)值进行评估)

第三,我应该如何处理这50种不同的产品?它们是不同的,但仍然有很强的相关性,我们已经通过其他方法(例如具有简单时间窗口的MLP)看到,当所有产品都在同一个模型中考虑时,结果会更好。目前摆在桌面上的一些想法是:

  • 将目标变量更改为不只是3个变量,而是3*50=150;i、 e.每个产品有三个目标,所有目标都同时接受培训
  • 将LSTM层后的结果拆分为50个密集网络,将LSTM的输出作为输入,再加上每个产品特有的一些功能-即,我们得到一个具有50个损失函数的多任务网络,然后一起优化。那会很疯狂吗
  • 将一个产品视为一个观察结果,并包括LSTM层中已经存在的特定于产品的特性。仅使用这一层,然后使用大小为3的输出层(用于三个目标)。将每个产品分为单独的批次进行推送
第四,如何处理验证数据?通常我会保留一个随机选择的样本进行验证,但这里我们需要保持时间顺序。所以我想最好的办法就是把几个月放在一边

第五,这可能是我最不清楚的部分-我如何利用实际结果进行预测?比如说,我使用了
return\u sequences=False
,并分三批对所有三年进行了培训(每次培训到11月),目的是培训模型预测下一个值(2014年12月、2015年12月、2016年12月)。如果我想在2017年使用这些结果,这实际上是如何工作的?如果我理解正确,在这个例子中,我唯一能做的就是将2017年1月至11月的所有数据点反馈给模型,然后它将返回2017年12月的预测。对吗?然而,如果我使用
return\u sequences=True
,然后根据截至2016年12月的所有数据进行培训,那么我是否能够通过给模型提供2017年1月观察到的特征来获得2017年1月的预测?或者我需要在2017年1月前的12个月内完成吗?那么2017年2月呢,我是否还需要给出2017年的价值,以及在此之前的11个月?(如果听起来我很困惑,那是因为我很困惑!)

最后,根据我应该使用的结构,在Keras中如何做到这一点?我现在想的是以下几点:(虽然这只适用于一种产品,所以不能解决所有产品都在同一型号中的问题):

Keras代码

trainX = trainingDataReshaped #Data for Product 1, Jan 2014 to Dec 2016
trainY = trainingTargetReshaped
validX = validDataReshaped #Data for Product 1, for ??? Maybe for a few months?
validY = validTargetReshaped    

numSequences = trainX.shape[0]
numTimeSteps = trainX.shape[1]
numFeatures = trainX.shape[2]

numTargets = trainY.shape[2]

model = Sequential()
model.add(LSTM(100, input_shape=(None, numFeatures), return_sequences=True)) 
model.add(Dense(numTargets, activation="softmax"))    

model.compile(loss=stackEntry.params["loss"],
      optimizer="adam",
      metrics=['accuracy'])

history = model.fit(trainX, trainY,
            batch_size=30,
            epochs=20,
            verbose=1,
            validation_data=(validX, validY))               

predictX  = predictionDataReshaped #Data for Product 1, Jan 2017 to Dec 2017

prediction=model.predict(predictX)
问题1 有几种方法可以解决这个问题。你提议的那个似乎是一个滑动窗口

但实际上你不需要划分时间维度,你可以一次输入所有3年。您可以对产品维度进行切片,以防您的批处理过大而无法满足内存和速度的要求

您可以使用形状
(产品、时间、,