File size: 9,872 Bytes
c61ccee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
"""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"""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]