Применение одномерной свертки на тензоре в Pytorch - PullRequest
1 голос
/ 04 апреля 2020

У меня есть тензор, который представляет собой набор одномерных сигналов, которые объединяются вдоль оси столбца. Скажем, у меня есть 300 1D сигналов размером 64. Поэтому [64x300]

Я хочу применить к нему ядро ​​с гладкой сверткой / скользящим средним [0,2 0,2 ​​0,2 ​​0,2 ​​0,2] на GPU, но я не уверен, что именно API, чтобы сделать это. Могу ли я привести пример?

1 Ответ

2 голосов
/ 04 апреля 2020

Вы можете использовать обычные torch.nn.Conv1d для этого.

Входы

В вашем случае у вас есть 1 канал (1D) с 300 временными шагами (пожалуйста, обратитесь к документации эти значения будут соответственно C_in и L_in).

Таким образом, для вашего ввода это будет (вам нужно 1 там, его нельзя сжать ! ):

import torch

inputs = torch.randn(64, 1, 300)

Свертка

Вам нужно torch.nn.Conv1d с kernel_size, равным 5 (как указано вашими элементами: [0.2 0.2 0.2 0.2 0.2]) и без bias. Я предполагаю, что ваш вывод должен быть одинакового размера (300), поэтому 2 элементы должны быть дополнены в начале и в конце. Все это дает нам этот модуль:

module = torch.nn.Conv1d(
    in_channels=1, out_channels=1, kernel_size=5, padding=2, bias=False
)

Веса этого модуля (0.2 значения) могут быть определены следующим образом:

module.weight.data = torch.full_like(module.weight.data, 0.2)

torch.full_like будет работать для ядра любой размер, если вам нужен другой размер, кроме 5.

Наконец, выполните средние шаги, и все готово:

out = module(inputs)

GPU

Если вы хотите для использования GPU просто разыграйте module и inputs следующим образом:

inputs = inputs.cuda()
module = module.cuda()

См. Документация CUDA для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...