Рекуррентная нейронная сеть с использованием разных временных шагов с керасом - PullRequest
0 голосов
/ 13 сентября 2018

Я строю 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 голосов
/ 13 сентября 2018

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

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

См. эту ветку для получения дополнительной информации.

...