Выход загруженной модели Keras отличается от вывода модели тренировки - PullRequest
0 голосов
/ 01 апреля 2020

Когда я тренирую свою модель, она имеет двухмерный выход - он (нет, 1) - соответствует временному ряду, который я пытаюсь предсказать. Но всякий раз, когда я загружаю сохраненную модель, чтобы делать прогнозы, она имеет трехмерный вывод - (none, 40, 1) - где 40 соответствует n_steps, требуемому для соответствия сети conv1D. Что не так?

Вот код:

 df = np.load('Principal.npy')


        # Conv1D
    #model = load_model('ModeloConv1D.h5')
    model = autoencoder_conv1D((2, 20, 17), n_steps=40)

    model.load_weights('weights_35067.hdf5')

    # summarize model.
    model.summary()

        # load dataset
    df = df


        # split into input (X) and output (Y) variables
    X = f.separar_interface(df, n_steps=40)
    # THE X INPUT SHAPE (59891, 17) length and attributes, respectively ##    

    # conv1D input format
    X = X.reshape(X.shape[0], 2, 20, X.shape[2])

    # Make predictions    

    test_predictions = model.predict(X)
    ## test_predictions.shape =  (59891, 40, 1)

    test_predictions = model.predict(X).flatten()
    ##test_predictions.shape = (2395640, 1)


    plt.figure(3) 
    plt.plot(test_predictions)
    plt.legend('Prediction')
    plt.show()

На графике ниже вы можете видеть, что он отображает формат ввода. enter image description here

Вот архитектура сети:

 _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    time_distributed_70 (TimeDis (None, 1, 31, 24)         4104      
    _________________________________________________________________
    time_distributed_71 (TimeDis (None, 1, 4, 24)          0         
    _________________________________________________________________
    time_distributed_72 (TimeDis (None, 1, 4, 48)          9264      
    _________________________________________________________________
    time_distributed_73 (TimeDis (None, 1, 1, 48)          0         
    _________________________________________________________________
    time_distributed_74 (TimeDis (None, 1, 1, 64)          12352     
    _________________________________________________________________
    time_distributed_75 (TimeDis (None, 1, 1, 64)          0         
    _________________________________________________________________
    time_distributed_76 (TimeDis (None, 1, 64)             0         
    _________________________________________________________________
    lstm_17 (LSTM)               (None, 100)               66000     
    _________________________________________________________________
    repeat_vector_9 (RepeatVecto (None, 40, 100)           0         
    _________________________________________________________________
    lstm_18 (LSTM)               (None, 40, 100)           80400     
    _________________________________________________________________
    time_distributed_77 (TimeDis (None, 40, 1024)          103424    
    _________________________________________________________________
    dropout_9 (Dropout)          (None, 40, 1024)          0         
    _________________________________________________________________
    dense_18 (Dense)             (None, 40, 1)             1025      
    =================================================================

1 Ответ

0 голосов
/ 03 апреля 2020

Поскольку я нашел свою ошибку и, как мне кажется, она может быть полезна для кого-то другого, я отвечу на свой вопрос: на самом деле сетевой вывод имеет тот же формат, что и метки обучающего набора данных. Это означает, что сохраненная модель генерирует выходные данные с формой (None, 40, 1), поскольку они точно такой же формы, которую вы (я) дали меткам выходных данных обучения.

Вы (т.е. я) цените Разница между выходом сети во время обучения и сетью при прогнозировании, потому что вы, скорее всего, используете такой метод, как train_test_split во время обучения, который рандомизирует выход сети. Поэтому в конце обучения вы видите производство этой рандомизированной партии.

Чтобы исправить вашу проблему (мою проблему), вы должны изменить форму меток набора данных с (Нет, 40, 1) на (Нет, 1), так как у вас есть проблема регрессии в течение некоторого времени серии. Чтобы исправить это в вашей сети, лучше установить плоский слой перед плотным выходным слоем. Поэтому я получу результат, который вы ищете.

...