Как изменить размер партии промежуточного слоя в Keras?

Моя задача - взять все скрытые результаты из LSTM и использовать их в качестве обучающих примеров для одного плотного слоя. Сглаживание вывода скрытых слоев и подача их в плотный слой - это не то, что я хочу сделать. Я пробовал следующие вещи:

  1. Я рассмотрел Timedistributed оболочку для плотного слоя ( https://keras.io/layers/wrappers/). Но это, кажется, применяет один и тот же слой к каждому временному срезу, а это не то, что я хочу. Другими словами, оболочка Timedistributed имеет input_shape 3D-тензора (количество выборок, количество временных шагов, количество объектов) и создает другой 3D-тензор того же типа: (количество выборок, количество временных шагов, количество объектов). Вместо этого я хочу получить двумерный тензор на выходе, который выглядит следующим образом (количество выборок * количество временных шагов, количество объектов)

  2. Был выдвинут запрос на получение расширенного слоя данных: https://github.com/fchollet/keras/pull/36 на GitHub. Кажется, это именно то, что я ищу. К сожалению, похоже, что этот запрос был закрыт без окончательного результата.

  3. Я попытался создать свой собственный лямбда-слой, чтобы выполнить то, что я хочу, следующим образом: A). model.add(LSTM(NUM_LSTM_UNITS, return_sequences=True, activation='tanh')) # B). model.add(Lambda(lambda x: x, output_shape=lambda x: (x[0]*x[1], x[2]))) C). model.add(Dense(NUM_CLASSES, input_dim=NUM_LSTM_UNITS))

mode.output_shape после (A) печатает: (BATCH_SIZE, NUM_TIME_STEPS, NUM_LSTM_UNITS) и model.output_shape после (B) печатает: (BATCH_SIZE*NUM_OF_TIMESTEPS, NUM_LSTM_UNITS)

Именно этого я и пытаюсь достичь.

К сожалению, когда я пытаюсь запустить шаг (С). Я получаю следующую ошибку:

Вход 0 несовместим со слоем плотной_1: ожидаемый ndim=2, найденный ndim=3

Это сбивает с толку, поскольку, когда я печатаю model.output_shape после (B), я действительно вижу (BATCH_SIZE*NUM_OF_TIMESTEPS, NUM_LSTM_UNITS), который имеет ndim=2.

Очень ценю любую помощь с этим.

РЕДАКТИРОВАТЬ: Когда я пытаюсь использовать функциональный API вместо последовательной модели, я все еще получаю ту же ошибку на шаге (C)

1 ответ

Вы можете использовать изменение формы бэкенда, которое включает измерение batch_size.

def backend_reshape(x):
    return backend.reshape(x, (-1, NUM_LSTM_UNITS))

model.add(Lambda(backend_reshape, output_shape=(NUM_LSTM_UNITS,)))
Другие вопросы по тегам