Как реализовать распределенный по времени плотный (TDD) слой в PyTorch - PullRequest
2 голосов
/ 22 апреля 2020

В некоторых моделях глубокого обучения, которые анализируют временные данные (например, аудио или видео), мы используем слой «плотно распределенный во времени» (TDD). Это создает полностью связанный (плотный) слой, который применяется отдельно к каждому временному шагу.

image

In Keras this can be done using the Оболочка TimeDistributed , которая на самом деле немного более общая. В PyTorch это был запрос открытой функции в течение пары лет.

Как мы можем реализовать плотно распределенный по времени вручную в PyTorch?

1 Ответ

1 голос
/ 22 апреля 2020

Специально для плотно распределенных по времени (а не распределенных по времени всего остального ) мы можем взломать его, используя сверточный слой.

Посмотрите на диаграмма, которую вы показали для слоя TDD. Мы можем повторно представить его как сверточный слой, где сверточное ядро ​​имеет «ширину» (во времени) ровно 1 и «высоту», которая соответствует полной высоте тензора. Если мы сделаем это, а также убедимся, что нашему ядру не разрешено выходить за пределы тензора, оно должно работать:

self.tdd = nn.Conv2d(1, num_of_output_channels, (num_of_input_channels, 1))

Возможно, вам потребуется выполнить некоторую перестановку тензорных осей. «Входные каналы» для этой строки кода на самом деле исходят из оси «freq» («ось y изображения») вашего тензора, а «выходные каналы» действительно располагаются на оси «канала». («Ось Y» выходных данных будет иметь размерность в 1 единицу высоты.)

...