Как устранить ошибки формы ввода массива для LSTM DQN? - PullRequest
0 голосов
/ 01 августа 2020

Я создаю DQN со слоями LSTM. Попытка передать модели 96timeperiod, 33 массивов функций для обучения ie: shape = (96, 33) Также пытаюсь реализовать маску с добавлением пост-заполнения (val = 0.) Для размещения последовательностей переменной длины (максимальная длина = 96) .

model = Sequential()
inp = (NUM_TIMEPERIODS, NUM_FEATURES)
model.add(Masking(mask_value=0., input_shape=inp))
model.add(LSTM(NUM_FEATURES, input_shape=inp, activation='tanh', return_sequences=True))
model.add(LSTM(NUM_FEATURES, activation='tanh'))
model.add(Dense(NUM_FEATURES, activation='relu'))
model.add(Dense(4, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy',
              optimizer=Adam(lr=LEARNING_RATE, decay=DECAY),
              metrics=['accuracy'])

Когда я отправляю последовательность с именем current_states с shape (96, 33), используя:

current_qs_list = self.model.predict(current_states)

для генерации q-значений, возвращается ошибка:

ValueError: Input 0 of layer lstm is incompatible with the layer: 
expected ndim=3, found ndim=2. Full shape received: [32, 33]

Я думаю, что 32 - это замаскированная длина (из максимальной длины 96) этой первой последовательности, отправляемой в модель и сбрасываемой ... Попробовали добавить входной слой непосредственно перед маскирующим слоем:

model.add(Input(batch_size=None, shape=inp))

но решения нет, только ошибки. Как переписать входные слои модели для приема и обучения на массиве [96,33], пожалуйста? Или мне нужно «объединить пакет последовательностей (например, 4 последовательности) в массив как [4, 96, 33], а затем передать его модели?»

1 Ответ

0 голосов
/ 02 августа 2020

Единственное возможное рабочее решение, которое я придумал, - это объединить два или более (96, 33) массивов в мини-пакет:

minibatchSize = 2
current_states = np.concatenate(array1(96,33), array2(96,33)).reshape(minbatchSize, 
                 NUM_TIMEPERIODS, NUM_FEATURES)

, а затем передать его модели, которая имеет добавленный ввод layerjust перед маскированием:

model.add(Input(batch_size=minibatchSize, shape=inp))

Просто невозможно заставить его работать без указания ненулевого или отличного от 1 размера пакета и указания этого размера пакета во входном слое. Необходимо использовать партии ...

...