为什么LSTM模型在多个模型运行中会产生不同的预测?

时间:2019-06-09 05:28:46

标签: python time-series lstm

我正在使用长期短期记忆(LSTM)生成预测。我注意到,每次我运行LSTM模型时,它都会用相同的数据生成略有不同的预测。我想知道为什么会这样,如果我做错了什么?

谢谢

from numpy import array
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers import TimeDistributed
from keras.layers.convolutional import Conv1D
from keras.layers.convolutional import MaxPooling1D

# split a univariate sequence into samples
def split_sequence(sequence, n_steps):
    X, y = list(), list()
    for i in range(len(sequence)):
        # find the end of this pattern
        end_ix = i + n_steps
        # check if we are beyond the sequence
        if end_ix > len(sequence)-1:
            break
        # gather input and output parts of the pattern
        seq_x, seq_y = sequence[i:end_ix], sequence[end_ix]
        X.append(seq_x)
        y.append(seq_y)
    return array(X), array(y)

def LSTM_Model(Data, N_Steps, Epochs):
    # define input sequence
    raw_seq = Data

    # choose a number of time steps
    n_steps_og = N_Steps

    # split into samples
    X, y = split_sequence(raw_seq, n_steps_og)

    # reshape from [samples, timesteps] into [samples, subsequences, timesteps, features]
    n_features = 1
    n_seq = 2
    n_steps = 2
    X = X.reshape((X.shape[0], n_seq, n_steps, n_features))


    # define model
    model = Sequential()
    model.add(TimeDistributed(Conv1D(filters=64, kernel_size=1, activation='relu'), input_shape=(None, n_steps, n_features)))
    model.add(TimeDistributed(MaxPooling1D(pool_size=2)))
    model.add(TimeDistributed(Flatten()))
    model.add(LSTM(50, activation='relu'))
    model.add(Dense(1))
    model.compile(optimizer='adam', loss='mse')


   # fit model
   model.fit(X, y, epochs=Epochs, verbose=2)
   #Create Forcasting data
   #Now take the last 4 days of the Model data for the forcast
   Forcast_data = Data[len(new_data) - n_steps_og:]

   # demonstrate prediction
   x_input = array(Forcast_data)
   x_input = x_input.reshape((1, n_seq, n_steps, n_features))
   yhat = float(model.predict(x_input, verbose=0))
   return(yhat)

1 个答案:

答案 0 :(得分:2)

像这样的许多方法都是使用系数的随机权重初始化的。然后,他们为某种损失函数寻找一个好的局部最小值。这意味着他们(希望)将仅找到许多接近最佳的解决方案之一,但不太可能找到单个非常好的解决方案,甚至不可能反复找到相同的解决方案。因此,只要您的预测只是稍有不同,您的结果就是典型的。

这更多是一个通用的机器学习问题,而不是特定于Python,但我希望这会有所帮助。