PyTorch如何实现向后卷积?
我阅读了Pytorch的源代码,发现它没有实现PyTorch如何实现向后卷积?,pytorch,convolution,Pytorch,Convolution,我阅读了Pytorch的源代码,发现它没有实现卷积_backward函数很奇怪,唯一的函数是直接引发一个错误,应该不会落在这里 所以我提到了CuDNN/MKLDNN实现,它们都实现了如下功能 我有一个问题: CUDA/CPU的本机实现是什么?我可以找到类似于thnn\u conv2d\u backward\u out的东西,但我找不到这是在哪里调用的 为什么Pytork没有将卷积\u向后放入函数?它提供了一个\u卷积\u double\u backward()函数。但这是双倒,这是梯度的梯度。
卷积_backward
函数很奇怪,唯一的函数是直接引发一个错误,应该不会落在这里
所以我提到了CuDNN/MKLDNN实现,它们都实现了如下功能
我有一个问题:
thnn\u conv2d\u backward\u out
的东西,但我找不到这是在哪里调用的
卷积\u向后放入函数?它提供了一个\u卷积\u double\u backward()
函数。但这是双倒,这是梯度的梯度。为什么它们不提供一个向后的函数呢
谢谢 1-实现可能因您使用的后端而异,它可能使用某些库中的CUDA卷积实现、其他库中的CPU卷积实现或自定义实现,请参见此处: 2-我不确定当前版本,但单向后是通过autograd计算的,这就是为什么没有明确的不同功能的原因。我不知道autograd的基本细节,但您可以查看。只有当你需要高阶导数时,这个双_向后函数才存在
3-如果您想在C中执行此操作,那么您链接的文件(convolution.cpp)将向您展示如何执行此操作(函数at::Tensor\u convolution…)。如果您检查函数,您会看到它只是检查要使用的实现(params.use_something…)并使用它。如果您想在python中实现这一点,您应该从conv开始跟踪,直到调用这个文件convolution.cpp为止。我在@unlut的帖子中找到了一些补充
谢谢,但是如果我想使用
grad\u输入
<代码>梯度权重和梯度偏差
,应通过**u卷积向后()函数计算。我应该如何从本机实现中获得这三个呢?我知道,深度学习lib库有一个<代码> CUnnnCyValPrimeBuffDrand()/Cuth>,但是CPU/CUDA如何?@ SUT CUDNN是一个用CUDA编写的深度学习库(它是字面意思是CUDA深度神经网络),对于CPU,你可以使用MKLDNN。您可以在存储库中的ATen->Native查看其他人。很抱歉,我的声明不完整。我的意思是,例如,当执行卷积时,它将落在\u卷积()
,此函数将判断是否使用cudnn/mkldnn,如果以上所有操作都不起作用,它将落在at::coulsion\u overridable
。我还想像\u revolution()
那样介绍向后函数,但是cudnn\u revolution\u revolution()
的入口点在哪里?什么时候调用cudnn\u卷积\u backward\u overridable()
和其他向后函数?@Sut正如我在第二点中所说,向后没有入口点,因为它不是直接调用的,它是通过autograd计算的。如果您想了解映射是如何执行的,您需要了解计算图是如何计算的。不幸的是,我不知道细节,但每个张量(更精确地说是变量)对象都应该包含有关它所涉及的函数的信息,并且当您在图形中开始反向传播时,它们各自的反向函数被调用。可能从autograd/variable.h中的grad\u fn或tools/autograd中的derivatives.yaml开始查看。
at::Tensor finput = at::empty({0},input.options());
at::Tensor fgrad_input = at::empty({0}, input.options());
auto kernel_size = weight.sizes().slice(2);
auto &&result = at::thnn_conv2d_backward(grad_output, input, weight,kernel_size , stride, padding,
finput, fgrad_input, output_mask);