Где использовать расширенную свертку в автокодировщике для временных данных?

Я пытаюсь построить и модель кодировщика-декодера для данных временных рядов с 1D сверткой в ​​Keras. Рассмотрим эту простую модель:

inputs = Input(shape = (timesteps, input_dim))
t = Conv1D(16, kernel_size=3, padding='same')(inputs)
encoded = Conv1D(16, kernel_size=2, strides=2)(t)

t = UpSampling1D(2)(encoded)
t = Conv1D(16, kernel_size=3, padding='same')(inputs)
decoded = Conv1D(1, kernel_size=3, padding='same')(t)

model = Model(inputs, decoded)

Мои вопросы:

  1. Где использовать дилатацию (dilation_rate=2)? Только в кодировщике или в обоих, чтобы максимально увеличить восприимчивое поле?

  2. Что мне следует использовать в качестве скрытого представления? Полностью связанный слой, низкоразмерное изображение (как указано выше), объединение или меньшее количество фильтров?


person Márton György    schedule 05.02.2018    source источник
comment
Почему вы хотите использовать dilation?   -  person Marcin Możejko    schedule 05.02.2018
comment
Чтобы максимально увеличить восприимчивое поле и иметь возможность сжать всю информацию из серии в небольшую структуру данных   -  person Márton György    schedule 08.02.2018


Ответы (1)


Этот ответ предназначен для других людей, которые пришли сюда через Google:

Расширение VS шаг: шаг уменьшает ответную реакцию. Таким образом, вы используете только один раз. Расширение увеличивает размер ядра за счет добавления нулей между ними. Это даст тот же эффект, что и шаги, но без уменьшения отклика. Пример Keras / tf.keras:

x = input_img

x = Conv2D(16, (3, 3), padding='valid')(x)
x = Conv2D(16, (3, 3), strides=2, padding='valid')(x)
x = Conv2D(16, (3, 3), padding='valid')(x)
x = Conv2D(16, (3, 3), strides=2, padding='valid')(x)
x = Conv2D(16, (3, 3), padding='valid')(x)

encoded = Conv2D(num_featers, (2, 2), padding='valid')(x)

Такой же как:

x = Conv2D(16, (3, 3), padding='valid')(x)
x = Conv2D(16, (3, 3), padding='valid')(x)
x = Conv2D(16, (3, 3), dilation_rate=2, padding='valid')(x)
x = Conv2D(16, (3, 3), dilation_rate=2, padding='valid')(x)
x = Conv2D(16, (3, 3), dilation_rate=4, padding='valid')(x)

encoded = Conv2D(num_featers, (2, 2), dilation_rate=4, padding='valid')(x)

Если вы замените шаги в автокодировщике на dilation_rate, как это, он будет работать. (Conv2dTranspose также имеет dilation_rate, но это не работает: https://github.com/keras-team/keras/issues/8159. Временное решение - обучение вашей сети с помощью шагов (кодировщик) и upscaling2d (декодер). Загрузите эти веса в более простой кодировщик с расширением, когда вы его не используете.)

О объединении: в этом случае объединение не требуется, но оно может помочь устранить смещение местоположения. Другой метод - увеличение переводов для получения того же результата. В зависимости от вашей проблемы, хотите вы этого или нет.

полностью связаны: полностью вышли из моды. Просто используйте слой свертки с размером, чтобы соединить все. Это точно так же, но позволит получить больший вклад.

Меньше или больше фильтров: никогда не знаю. Визуализируйте свой фильтр и / или ответ фильтра. Если вы видите фильтры, которые очень похожи, вы использовали много фильтров. Или недостаточно стимулировал различие в натуре (отсев и увеличение данных могли в этом помочь).

person Tom Nijhof    schedule 16.08.2018