如何使用 NVIDIA cuDNN 计算 'full' 卷积?
How to compute a 'full' convolution with NVIDIA cuDNN?
我正在针对简单问题测试 NVIDIA cuDNN 库。我正在尝试实现一些我认为很简单的事情,即进行 'full' 卷积。我已经能够使用前向算法计算 'valid' 卷积而没有太多问题,但是我无法使用 'full' 卷积的后向算法进行同样的计算。
我已经为我的输入、内核和卷积准备了张量并尝试了:
cudnnConvolutionBackwardData(handle.get(),
alpha, //Set to 1.0
filter, //Filter descriptor
kernel_gpu_memory,
input_tensor, //The input tensor descriptor
input_gpu_memory,
convolution, //The convolution descriptor
conv_algo, //Obtained with getConvolutionBackwardDataAlgorithm
workspace_cpu_memory,
workspace_size, //Obtained with getConvolutionBackwardDataWorkspaceSize
beta, //Set to 0.0
output_tensor, //The output tensor descriptor
conv_gpu_memory);
我检查了所有 CUDA 调用的 return,我没有错误,但结果不是正确的 'full' 卷积的结果。我正在将获得的结果与 matlab 的 'full' 卷积进行比较。
我想这不符合我的预期。我应该尝试 convolutionBackwardFilter 算法吗?
如何使用 cudnn 执行 'full' 卷积?
我明白了。默认情况下,他们认为权重在操作前已经翻转。因此,它必须配置为 CUDNN_CROSS_CORRELATION 而不是 CUDNN_CONVOLUTION.
我正在针对简单问题测试 NVIDIA cuDNN 库。我正在尝试实现一些我认为很简单的事情,即进行 'full' 卷积。我已经能够使用前向算法计算 'valid' 卷积而没有太多问题,但是我无法使用 'full' 卷积的后向算法进行同样的计算。
我已经为我的输入、内核和卷积准备了张量并尝试了:
cudnnConvolutionBackwardData(handle.get(),
alpha, //Set to 1.0
filter, //Filter descriptor
kernel_gpu_memory,
input_tensor, //The input tensor descriptor
input_gpu_memory,
convolution, //The convolution descriptor
conv_algo, //Obtained with getConvolutionBackwardDataAlgorithm
workspace_cpu_memory,
workspace_size, //Obtained with getConvolutionBackwardDataWorkspaceSize
beta, //Set to 0.0
output_tensor, //The output tensor descriptor
conv_gpu_memory);
我检查了所有 CUDA 调用的 return,我没有错误,但结果不是正确的 'full' 卷积的结果。我正在将获得的结果与 matlab 的 'full' 卷积进行比较。
我想这不符合我的预期。我应该尝试 convolutionBackwardFilter 算法吗?
如何使用 cudnn 执行 'full' 卷积?
我明白了。默认情况下,他们认为权重在操作前已经翻转。因此,它必须配置为 CUDNN_CROSS_CORRELATION 而不是 CUDNN_CONVOLUTION.