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()函数。但这是双倒,这是梯度的梯度。

我阅读了Pytorch的源代码,发现它没有实现
卷积_backward
函数很奇怪,唯一的函数是直接引发一个错误,应该不会落在这里

所以我提到了CuDNN/MKLDNN实现,它们都实现了如下功能

我有一个问题:

  • CUDA/CPU的本机实现是什么?我可以找到类似于
    thnn\u conv2d\u backward\u out
    的东西,但我找不到这是在哪里调用的

  • 为什么Pytork没有将
    卷积\u向后放入
    函数?它提供了一个
    \u卷积\u double\u backward()
    函数。但这是双倒,这是梯度的梯度。为什么它们不提供一个向后的函数呢

  • 如果我想为我的纯cpu/cuda张量调用本机卷积/卷积\向后函数,我应该如何编写代码?或者我可以提到哪里?我找不到这方面的例子


  • 谢谢

    1-实现可能因您使用的后端而异,它可能使用某些库中的CUDA卷积实现、其他库中的CPU卷积实现或自定义实现,请参见此处:

    2-我不确定当前版本,但单向后是通过autograd计算的,这就是为什么没有明确的不同功能的原因。我不知道autograd的基本细节,但您可以查看。只有当你需要高阶导数时,这个双_向后函数才存在


    3-如果您想在C中执行此操作,那么您链接的文件(convolution.cpp)将向您展示如何执行此操作(函数at::Tensor\u convolution…)。如果您检查函数,您会看到它只是检查要使用的实现(params.use_something…)并使用它。如果您想在python中实现这一点,您应该从conv开始跟踪,直到调用这个文件convolution.cpp为止。

    我在@unlut的帖子中找到了一些补充

  • 卷积方法位于不同实现的单独文件中。您可能会发现cudnn\u卷积向后或mkldnn\u卷积向后很容易。一件棘手的事情是,很难找到最终的本机fall函数。这是因为目前Pytorch团队正在将Thnn功能移植到ATen,您可以参考
  • 本机函数可以如下所示

  • 向后卷积不是通过autograd计算的,而是必须有一个conv_向后函数,并且必须记录在derivatives.yaml中。如果您想找到特定的反向函数,请参考该文件,这是一个良好的开端

  • 关于这段代码,如果要直接调用thnn_backward函数,则需要显式构造finput和fgrad_输入。这是作为缓冲区提供的两个空张量


  • 谢谢,但是如果我想使用
    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);