| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298 |
- # mypy: allow-untyped-defs
- """Gradient interface."""
- import torch
- from torch.nn.modules.utils import _pair, _single, _triple
- def conv1d_input(
- input_size,
- weight,
- grad_output,
- stride=1,
- padding=0,
- dilation=1,
- groups=1,
- ):
- r"""Compute 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"""Compute 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"""Compute 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"""Compute 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"""Compute 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"""Compute 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]
|