123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- """Gradient interface"""
- import torch
- from .modules.utils import _single, _pair, _triple
- def conv1d_input(input_size, weight, grad_output, stride=1, padding=0, dilation=1, groups=1):
- r"""
- Computes the gradient of conv1d with respect to the input of the convolution.
- This is same as the 1D transposed convolution operator under the hood but requires
- the shape of the gradient w.r.t. input to be specified explicitly.
- Args:
- input_size : Shape of the input gradient tensor
- weight: weight tensor (out_channels x in_channels/groups x kW)
- grad_output : output gradient tensor (minibatch x out_channels x oW)
- stride (int or tuple, optional): Stride of the convolution. Default: 1
- padding (int or tuple, optional): Zero-padding added to both sides of the input. Default: 0
- dilation (int or tuple, optional): Spacing between kernel elements. Default: 1
- groups (int, optional): Number of blocked connections from input channels to output channels. Default: 1
- Examples::
- >>> input = torch.randn(1, 1, 3, requires_grad=True)
- >>> weight = torch.randn(1, 1, 1, requires_grad=True)
- >>> output = F.conv1d(input, weight)
- >>> grad_output = torch.randn(output.shape)
- >>> grad_input = torch.autograd.grad(output, input, grad_output)
- >>> F.grad.conv1d_input(input.shape, weight, grad_output)
- """
- input = grad_output.new_empty(1).expand(input_size)
- return torch.ops.aten.convolution_backward(grad_output, input, weight, None,
- _single(stride), _single(padding), _single(dilation),
- False, [0], groups, (True, False, False))[0]
- def conv1d_weight(input, weight_size, grad_output, stride=1, padding=0, dilation=1, groups=1):
- r"""
- Computes the gradient of conv1d with respect to the weight of the convolution.
- Args:
- input: input tensor of shape (minibatch x in_channels x iW)
- weight_size : Shape of the weight gradient tensor
- grad_output : output gradient tensor (minibatch x out_channels x oW)
- stride (int or tuple, optional): Stride of the convolution. Default: 1
- padding (int or tuple, optional): Zero-padding added to both sides of the input. Default: 0
- dilation (int or tuple, optional): Spacing between kernel elements. Default: 1
- groups (int, optional): Number of blocked connections from input channels to output channels. Default: 1
- Examples::
- >>> input = torch.randn(1, 1, 3, requires_grad=True)
- >>> weight = torch.randn(1, 1, 1, requires_grad=True)
- >>> output = F.conv1d(input, weight)
- >>> grad_output = torch.randn(output.shape)
- >>> # xdoctest: +SKIP
- >>> grad_weight = torch.autograd.grad(output, filter, grad_output)
- >>> F.grad.conv1d_weight(input, weight.shape, grad_output)
- """
- weight = grad_output.new_empty(1).expand(weight_size)
- return torch.ops.aten.convolution_backward(grad_output, input, weight, None,
- _single(stride), _single(padding), _single(dilation),
- False, [0], groups, (False, True, False))[1]
- def conv2d_input(input_size, weight, grad_output, stride=1, padding=0, dilation=1, groups=1):
- r"""
- Computes the gradient of conv2d with respect to the input of the convolution.
- This is same as the 2D transposed convolution operator under the hood but requires
- the shape of the gradient w.r.t. input to be specified explicitly.
- Args:
- input_size : Shape of the input gradient tensor
- weight: weight tensor (out_channels x in_channels/groups x kH x kW)
- grad_output : output gradient tensor (minibatch x out_channels x oH x oW)
- stride (int or tuple, optional): Stride of the convolution. Default: 1
- padding (int or tuple, optional): Zero-padding added to both sides of the input. Default: 0
- dilation (int or tuple, optional): Spacing between kernel elements. Default: 1
- groups (int, optional): Number of blocked connections from input channels to output channels. Default: 1
- Examples::
- >>> input = torch.randn(1, 1, 3, 3, requires_grad=True)
- >>> weight = torch.randn(1, 1, 1, 2, requires_grad=True)
- >>> output = F.conv2d(input, weight)
- >>> grad_output = torch.randn(output.shape)
- >>> grad_input = torch.autograd.grad(output, input, grad_output)
- >>> F.grad.conv2d_input(input.shape, weight, grad_output)
- """
- input = grad_output.new_empty(1).expand(input_size)
- return torch.ops.aten.convolution_backward(grad_output, input, weight, None,
- _pair(stride), _pair(padding), _pair(dilation),
- False, [0], groups, (True, False, False))[0]
- def conv2d_weight(input, weight_size, grad_output, stride=1, padding=0, dilation=1, groups=1):
- r"""
- Computes the gradient of conv2d with respect to the weight of the convolution.
- Args:
- input: input tensor of shape (minibatch x in_channels x iH x iW)
- weight_size : Shape of the weight gradient tensor
- grad_output : output gradient tensor (minibatch x out_channels x oH x oW)
- stride (int or tuple, optional): Stride of the convolution. Default: 1
- padding (int or tuple, optional): Zero-padding added to both sides of the input. Default: 0
- dilation (int or tuple, optional): Spacing between kernel elements. Default: 1
- groups (int, optional): Number of blocked connections from input channels to output channels. Default: 1
- Examples::
- >>> input = torch.randn(1, 1, 3, 3, requires_grad=True)
- >>> weight = torch.randn(1, 1, 1, 2, requires_grad=True)
- >>> output = F.conv2d(input, weight)
- >>> grad_output = torch.randn(output.shape)
- >>> # xdoctest: +SKIP
- >>> grad_weight = torch.autograd.grad(output, filter, grad_output)
- >>> F.grad.conv2d_weight(input, weight.shape, grad_output)
- """
- weight = grad_output.new_empty(1).expand(weight_size)
- return torch.ops.aten.convolution_backward(grad_output, input, weight, None,
- _pair(stride), _pair(padding), _pair(dilation),
- False, [0], groups, (False, True, False))[1]
- def conv3d_input(input_size, weight, grad_output, stride=1, padding=0, dilation=1, groups=1):
- r"""
- Computes the gradient of conv3d with respect to the input of the convolution.
- This is same as the 3D transposed convolution operator under the hood but requires
- the shape of the gradient w.r.t. input to be specified explicitly.
- Args:
- input_size : Shape of the input gradient tensor
- weight: weights tensor (out_channels x in_channels/groups x kT x kH x kW)
- grad_output : output gradient tensor (minibatch x out_channels x oT x oH x oW)
- stride (int or tuple, optional): Stride of the convolution. Default: 1
- padding (int or tuple, optional): Zero-padding added to both sides of the input. Default: 0
- dilation (int or tuple, optional): Spacing between kernel elements. Default: 1
- groups (int, optional): Number of blocked connections from input channels to output channels. Default: 1
- Examples::
- >>> input = torch.randn(2, 8, 10, 10, 20, requires_grad=True)
- >>> weight = torch.randn(4, 8, 2, 3, 3, requires_grad=True)
- >>> output = F.conv3d(input, weight)
- >>> grad_output = torch.randn(output.shape)
- >>> grad_input = torch.autograd.grad(output, input, grad_output)
- >>> F.grad.conv3d_input(input.shape, weight, grad_output)
- """
- input = grad_output.new_empty(1).expand(input_size)
- return torch.ops.aten.convolution_backward(grad_output, input, weight, None,
- _triple(stride), _triple(padding), _triple(dilation),
- False, [0], groups, (True, False, False))[0]
- def conv3d_weight(input, weight_size, grad_output, stride=1, padding=0, dilation=1, groups=1):
- r"""
- Computes the gradient of conv3d with respect to the weight of the convolution.
- Args:
- input: input tensor of shape (minibatch x in_channels x iT x iH x iW)
- weight_size : Shape of the weight gradient tensor
- grad_output : output gradient tensor (minibatch x out_channels x oT x oH x oW)
- stride (int or tuple, optional): Stride of the convolution. Default: 1
- padding (int or tuple, optional): Zero-padding added to both sides of the input. Default: 0
- dilation (int or tuple, optional): Spacing between kernel elements. Default: 1
- groups (int, optional): Number of blocked connections from input channels to output channels. Default: 1
- Examples::
- >>> input = torch.randn(2, 8, 10, 10, 20, requires_grad=True)
- >>> weight = torch.randn(4, 8, 2, 3, 3, requires_grad=True)
- >>> output = F.conv3d(input, weight)
- >>> grad_output = torch.randn(output.shape)
- >>> grad_weight = torch.autograd.grad(output, weight, grad_output)
- >>> F.grad.conv3d_weight(input, weight.shape, grad_output)
- """
- weight = grad_output.new_empty(1).expand(weight_size)
- return torch.ops.aten.convolution_backward(grad_output, input, weight, None,
- _triple(stride), _triple(padding), _triple(dilation),
- False, [0], groups, (False, True, False))[1]
|