Рекуррентная нейронная сеть с использованием разных временных шагов с keras

Я создаю RNN с помощью keras, но когда я хочу изменить временные шаги на другой размер, я получаю сообщение об ошибке и не могу это сделать вот мой пример фиктивных данных

from numpy import array
import numpy as np

import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
from sklearn.preprocessing import MinMaxScaler
from keras import optimizers


X=array(
    [
        [#first sample
            [0,2],[1,2],[2,2]    # three time steps and 2 features
        ]
        ,
        [# sample 2
            [0,2],[1,2],[2,2]    # three time steps and 2 features
        ]
        ,
        [# sample 3
            [7,2], [9,2], [4,2]  # three time steps and 2 features
        ]
        ,
        [# sample 4
            [2,2], [5,2], [4,2],[7,9]  # four steps and 2 features
        ]
    ]
)


Y=np.array([1,2,3,4])


model = Sequential()
model.add(LSTM(8, input_shape=(None, 2),return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(32,return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(128,return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(58, activation='softmax'))
optimize=optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=None, decay=0.0)
model.compile(optimize,loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.summary()

model.fit(X,Y,batch_size=1,epochs=50,shuffle=True,verbose=2)

как вы можете видеть из кода, у меня есть 4 последовательности и 2 функции в каждой последовательности. в последней последовательности у меня есть 4 временных шага вместо 3, и вот проблема, если я изменю его на 3 временных шага, код работает правильно, но я хочу, чтобы он работал с разными временными шагами, как я могу добиться этого без использования отступов или маскировки.

Я читал разные темы, описывающие разные решения, но я не могу заставить их работать в приведенном выше примере.

когда я пытаюсь запустить вышеуказанный код, я получаю ошибку

ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (4, 1)
1
0
561
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш X не является допустимым массивом. Массив numpy должен быть прямоугольным и не зубчатым. Keras может принимать только действительные массивы numpy в качестве входных данных. У вас есть два варианта:

  1. Подавайте образцы в вашу модель по одному образцу за раз. Т.е. используйте batch_size 1, используйте fit_on_batch или fit_generator, а не только fit. Обратите внимание, что это удалит все оптимизации скорости, связанные с векторизацией, и замедлит ваше обучение до ползания, если у вас много данных.
  2. Заполните свой тренировочный набор так, чтобы все они были одного временного измерения. 0-padding не должен сильно влиять на производительность вашей модели. Это рекомендуемый метод.

Подробнее см. Поток это.

спасибо за отличный ответ. должен ли он давать лучшие результаты, если я использую fit_on_batch вместо заполнения обучающего набора? даже если на это уйдет много времени? или не ?

osama 13.09.2018 20:22

@osama обычно является предпочтительным методом заполнения обучающего набора, это не должно сильно влиять на точность вашей модели.

enumaris 13.09.2018 20:30

Наряду с заполнением нулями используйте слой Masking, чтобы нули действительно игнорировались keras.io/layers/core/#masking.

Kota Mori 13.09.2018 21:54

Другие вопросы по теме