gpt4 book ai didi

简单一维信号上的 Pytorch Conv1d

转载 作者:行者123 更新时间:2023-12-04 07:56:44 28 4
gpt4 key购买 nike

手动完成时,一维卷积非常简单。但是,我想实现所做的here使用 nn.Conv1d而我做到这一点并不简单。在这个例子中 h=[1,2,-1], x=[4,1,2,5] 并且输出将是 y=[4,9,0,8,8,-5]。要使用 Pytorch 做到这一点,我们需要定义 h=nn.Conv1d(in, out, k)x=torch.tensor(*)y=h(x)应该是结果。
注:请不要使用 nn.Conv2d来实现它。

最佳答案

首先,您应该意识到,基本上所有与卷积神经网络 (CNN) 相关的文献中使用的术语“卷积”实际上对应于 correlation operation不是 convolution operation .
相关和卷积之间的唯一区别(对于实值输入)是在卷积中,内核在将其滑过信号之前被翻转/镜像,而在相关中没有发生这种翻转。
CNN 中的卷积层还执行一些不属于卷积定义的额外操作。他们应用偏移量(也称为偏差),对小批量进行操作,并将多 channel 输入映射到多 channel 输出。
因此,为了使用卷积层重新创建卷积操作,我们应该 (i) 禁用偏差,(ii) 翻转内核,以及 (iii) 将批量大小、输入 channel 和输出 channel 设置为 1。
例如,卷积操作的 PyTorch 实现使用 nn.Conv1d 看起来像这样:

import torch
from torch import nn

x = torch.tensor([4, 1, 2, 5], dtype=torch.float)
k = torch.tensor([1, 2, -1], dtype=torch.float)

# Define these constants to differentiate the various usages of "1".
BATCH_SIZE, IN_CH, OUT_CH = 1, 1, 1

# Pad with len(k)-1 zeros to ensure all non-zero outputs are computed.
h = nn.Conv1d(IN_CH, OUT_CH, kernel_size=len(k), padding=len(k) - 1, bias=False)

# Copy flipped k into h.weight.
# h.weight is shape (OUT_CH, IN_CH, kernel_size), reshape k accordingly.
# Perform copy inside no_grad context to avoid autograd issues.
with torch.no_grad():
h.weight.copy_(torch.flip(k, dims=[0]).reshape(OUT_CH, IN_CH, -1))

# Input shape to h is assumed to be (BATCH_SIZE, IN_CH, SIGNAL_LENGTH), reshape x accordingly.
# Output shape of h is (BATCH_SIZE, OUT_CH, OUTPUT_LENGTH), reshape output to 1D signal.
y = h(x.reshape(BATCH_SIZE, IN_CH, -1)).reshape(-1)
这导致
>>> print(y)
tensor([ 4., 9., 0., 8., 8., -5.], grad_fn=<ViewBackward>)

关于简单一维信号上的 Pytorch Conv1d,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66663657/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com