Специально для плотно распределенных по времени (а не распределенных по времени всего остального ) мы можем взломать его, используя сверточный слой.
Посмотрите на диаграмма, которую вы показали для слоя TDD. Мы можем повторно представить его как сверточный слой, где сверточное ядро имеет «ширину» (во времени) ровно 1 и «высоту», которая соответствует полной высоте тензора. Если мы сделаем это, а также убедимся, что нашему ядру не разрешено выходить за пределы тензора, оно должно работать:
self.tdd = nn.Conv2d(1, num_of_output_channels, (num_of_input_channels, 1))
Возможно, вам потребуется выполнить некоторую перестановку тензорных осей. «Входные каналы» для этой строки кода на самом деле исходят из оси «freq» («ось y изображения») вашего тензора, а «выходные каналы» действительно располагаются на оси «канала». («Ось Y» выходных данных будет иметь размерность в 1 единицу высоты.)