Почему модель LSTM дает разные прогнозы для нескольких прогонов модели? - PullRequest
2 голосов
/ 09 июня 2019

Я использую долговременную память (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 Ответ

2 голосов
/ 09 июня 2019

Многие методы, подобные этому, инициализируются случайными весами для коэффициентов. Затем они ищут хороший локальный минимум для некоторой функции потерь. Это означает, что они (будем надеяться) найдут лишь одно из многих почти оптимальных решений, но вряд ли найдут единственное самое лучшее решение или даже не найдут одно и то же решение неоднократно. В связи с этим ваши результаты являются типичными, если ваши прогнозы лишь немного отличаются.

Это скорее вопрос общего машинного обучения, а не специфический для Python, но я надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...