【发布时间】:2020-07-16 20:16:11
【问题描述】:
我有一个表示一组 1D 信号的张量,这些信号沿列轴连接。假设我有 300 个大小为 64 的 1D 信号。所以 [64x300]
我想在 GPU 上应用平滑卷积/移动平均内核 [0.2 0.2 0.2 0.2 0.2],但我不确定执行此操作的 API 到底是什么。可以举个例子吗?
【问题讨论】:
标签: pytorch
我有一个表示一组 1D 信号的张量,这些信号沿列轴连接。假设我有 300 个大小为 64 的 1D 信号。所以 [64x300]
我想在 GPU 上应用平滑卷积/移动平均内核 [0.2 0.2 0.2 0.2 0.2],但我不确定执行此操作的 API 到底是什么。可以举个例子吗?
【问题讨论】:
标签: pytorch
您可以使用普通的torch.nn.Conv1d 来执行此操作。
在您的情况下,您有 300 时间步长的 1 频道 (1D)(请 refer to documentation 这些值将适当地为 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,只需像这样投射你的module 和inputs:
inputs = inputs.cuda()
module = module.cuda()
更多信息请参见CUDA documentation。
【讨论】: