Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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 Tensorflow中带有LSTM的时间序列预测模型预测一个常数_Python_Tensorflow_Time Series_Lstm_Weather - Fatal编程技术网

Python Tensorflow中带有LSTM的时间序列预测模型预测一个常数

Python Tensorflow中带有LSTM的时间序列预测模型预测一个常数,python,tensorflow,time-series,lstm,weather,Python,Tensorflow,Time Series,Lstm,Weather,我正在利用卫星数据建立飓风路径预测器。我在多层LSTM模型中有多对多输出,输入和输出数组遵循结构[samples[time[features]]。我将飓风、WS和其他维度的坐标作为输入和输出的特征 问题是误差减少,因此,模型总是预测一个常数。在阅读了几篇文章之后,我对数据进行了标准化,删除了一些不必要的层,但模型总是预测相同的输出 我认为这个模型足够大,激活函数是有意义的,因为输出都在[-1;1]之内。 所以我的问题是:我做错了什么 模型如下所示: class Stacked_LSTM():

我正在利用卫星数据建立飓风路径预测器。我在多层LSTM模型中有多对多输出,输入和输出数组遵循结构[samples[time[features]]。我将飓风、WS和其他维度的坐标作为输入和输出的特征

问题是误差减少,因此,模型总是预测一个常数。在阅读了几篇文章之后,我对数据进行了标准化,删除了一些不必要的层,但模型总是预测相同的输出

我认为这个模型足够大,激活函数是有意义的,因为输出都在[-1;1]之内。 所以我的问题是:我做错了什么

模型如下所示:

class Stacked_LSTM():

    def __init__(self, training_inputs, training_outputs, n_steps_in, n_steps_out, n_features_in, n_features_out, metrics, optimizer, epochs):
        self.training_inputs = training_inputs
        self.training_outputs = training_outputs
        self.epochs = epochs

        self.n_steps_in = n_steps_in
        self.n_steps_out = n_steps_out
        self.n_features_in = n_features_in
        self.n_features_out = n_features_out
        self.metrics = metrics
        self.optimizer = optimizer

        self.stop = EarlyStopping(monitor='loss', min_delta=0.000000000001, patience=30)

        self.model = Sequential()
        self.model.add(LSTM(360, activation='tanh', return_sequences=True, input_shape=(self.n_steps_in, self.n_features_in,))) #, kernel_regularizer=regularizers.l2(0.001), not a good idea
        self.model.add(layers.Dropout(0.1))
        self.model.add(LSTM(360, activation='tanh'))
        self.model.add(layers.Dropout(0.1))
        self.model.add(Dense(self.n_features_out*self.n_steps_out))
        self.model.add(Reshape((self.n_steps_out, self.n_features_out)))
        self.model.compile(optimizer=self.optimizer, loss='mae', metrics=[metrics])

    def fit(self):
        return self.model.fit(self.training_inputs, self.training_outputs, callbacks=[self.stop], epochs=self.epochs)

    def predict(self, input):
        return self.model.predict(input)
注释 1) 在这个特殊的问题中,时间序列数据不是“连续的”,因为一个时间序列属于一个特定的飓风。因此,我对时间序列的训练和测试样本进行了调整,以适应每一场飓风。这意味着我不能在我的层中使用函数
stateful=True
,因为这意味着模型不会在不同的飓风之间产生任何差异(如果我的理解是正确的)


2) 没有图像数据,因此不需要卷积模型。

根据我的经验,有几点建议:

  • 4层LSTM太多了。坚持两个,最多三个

  • 不要将
    relu
    用作LSTM的激活

  • 不要对时间序列使用
    BatchNormalization


  • 除此之外,我还建议移除两个LSTM层之间的致密层。

    Hmmm。。。结果并不是真的更好,但感谢您的回复。最终,为什么在时间序列中使用BatchNormalization是错误的?实际上,模型总是预测相同的内容。您是否也需要以
    [批处理、时间步、功能]
    格式的输出?这就是为什么要重塑
    稠密
    层的输出?您不使用BatchNormalization Is time,因为您希望时间步长中的任何波动对模型可见。对于图像,这种波动可能是噪声。在时间序列中,它们可能是合法的数据。是的,我需要这种格式的输出,这就是为什么我在密集层之后对其进行重塑