使用Tensorflow中的LSTM进行时间序列预测的模型结果不佳

问题描述 投票:0回答:1

我正在使用卫星数据构建飓风预报器。我在多层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)
        self.model.add(Dense(180, input_shape=(None, self.n_steps_in, 128)))
        self.model.add(BatchNormalization())
        self.model.add(layers.Dropout(0.1))
        self.model.add(LSTM(360, activation='relu', return_sequences=True))#, kernel_regularizer=regularizers.l2(0.001)
        self.model.add(Dense(180, input_shape=(None, self.n_steps_in, 128)))
        self.model.add(BatchNormalization())
        self.model.add(layers.Dropout(0.1))
        self.model.add(LSTM(360, activation='relu', return_sequences=True))#, kernel_regularizer=regularizers.l2(0.001)
        self.model.add(Dense(180, input_shape=(None, self.n_steps_in, 128)))
        self.model.add(BatchNormalization())
        self.model.add(layers.Dropout(0.1))
        self.model.add(LSTM(360, activation='tanh'))#, kernel_regularizer=regularizers.l2(0.001)
        self.model.add(BatchNormalization())
        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])

注意1)在此特定问题中,时间序列数据不是“连续的”,因为一个时间序列属于特定的飓风。因此,我针对每个飓风调整了时间序列的训练和测试样本。这意味着我不能在图层中使用函数stateful=True,因为这将意味着该模型在不同的飓风之间没有任何区别(如果我的理解是正确的话)。

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

python tensorflow time-series lstm weather
1个回答
0
投票

根据我的经验,没有什么建议:

  1. LSTM的4层太多了。坚持两个,最多三个。

  2. 不要将relu用作LSTM的激活。

  3. 请勿将BatchNormalization用于时间序列。

除此之外,我还建议删除两个LSTM层之间的密集层。

© www.soinside.com 2019 - 2024. All rights reserved.