PyTorch, Convolution Backward'ı nasıl uygular?
Pytorch'un kaynak kodunu okudum ve bunun convolution_backwardişlevi uygulamaması garip buluyorum , Tek convolution_backward_overrideableişlev doğrudan bir hata veriyor ve buraya düşmemesi gerekiyor.
Bu yüzden CuDNN / MKLDNN uygulamasına atıfta bulundum, ikisi de gibi işlevleri yerine getiriyor cudnn_convolution_backward.
Şu soruyu aldım:
CUDA / CPU'nun yerel uygulaması nedir? Gibi bir şey bulabilirim
thnn_conv2d_backward_outama buna nerede denildiğini bulamadım.PyTorch neden
convolution_backwardişlevi Convolution.cpp'ye koymadı ? Bir_convolution_double_backward()işlev sunar . Ama bu geriye doğru çifte, gradyan gradyanı. Neden geriye dönük tek bir işlev sunmuyorlar?Saf cpu / cuda tensörüm için native convolution / convolution_backward işlevini çağırmak istersem, nasıl kod yazmalıyım? Ya da nereye başvurabilirim? Buna örnek bulamadım.
Teşekkürler !
Yanıtlar
1- Uygulama, hangi arka ucu kullandığınıza bağlı olarak farklılık gösterebilir, bazı kitaplıklardan CUDA evrişim uygulamasını, başka bir kitaplıktan CPU evrişim uygulamasını veya özel uygulamayı kullanabilir, buraya bakın: pytorch - "conv1d" nerede uygulanır? .
2- Şu anki sürümden emin değilim, ancak tek bir geriye doğru autograd ile hesaplandı, bu yüzden onun için açık bir farklı işlev yoktu. Otomatik sınıflamanın temelindeki ayrıntıları bilmiyorum ama kontrol edebilirsinizhttps://github.com/pytorch/pytorch/blob/master/torch/csrc/autograd/autograd.cpp. Bu double_backward işlevi yalnızca daha yüksek mertebeden türevlere ihtiyacınız varsa vardır.
3- Bunu C de yapmak istiyorsanız, bağladığınız dosya (convolution.cpp) size bunu nasıl yapacağınızı gösterir (function at :: Tensor _convolution ...). İşlevi incelerseniz, yalnızca hangi uygulamanın kullanılacağını (params.use_something ...) ve kullanacağını kontrol ettiğini görürsünüz. Bunu python'da yapmak istiyorsanız, convolution.cpp dosyasının çağrıldığı yere kadar conv izlemeye başlamalısınız.
@ Unlut'un gönderisine ek bir şey buldum.
- Evrişim yöntemi, farklı uygulamalar için ayrı dosyalardadır. Cudnn_convoluton_backward veya mkldnn_convolution_backward'ı kolayca bulabilirsiniz. Zor olan bir şey, son yerel düşme işlevini bulmanın zor olmasıdır. Bunun nedeni şu anda Pytorch Takımlarının Thnn işlevini ATen'e taşımasıdır, PR24507'ye başvurabilirsiniz .
Yerel işlev thnn_con2d_backward olarak bulunabilir .
Geriye doğru evrişim autograd yoluyla hesaplanmaz, bunun yerine bir conv_backward işlevi olmalıdır ve bu, derivatives.yaml dosyasına kaydedilmelidir. Belirli bir geriye dönük işlev bulmak istiyorsanız, o dosyaya bakın, iyi bir başlangıçtır.
Bu kodla ilgili olarak, thnn_backward işlevini doğrudan çağırmak istiyorsanız, finput ve fgrad_input'u açıkça yapılandırmanız gerekir. Bunlar, tampon olarak sunulan iki boş tensördür.
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);