@@ -133,6 +133,46 @@ public static Tensor[] _SquaredDifferenceGrad(Operation op, Tensor[] grads)
133133 - x_grad
134134 } ;
135135 }
136+
137+ /// <summary>
138+ /// The derivatives for deconvolution.
139+ /// </summary>
140+ /// <param name="op">The Deconvolution op.</param>
141+ /// <param name="grads">The tensor representing the gradient w.r.t. the output</param>
142+ /// <returns>The gradients w.r.t. the input and the filter</returns>
143+ [ RegisterGradient ( "Conv2DBackpropInput" ) ]
144+ public static Tensor [ ] _Conv2DBackpropInputGrad ( Operation op , Tensor [ ] grads )
145+ {
146+ var grad = grads [ 0 ] ;
147+ var dilations = op . get_attr_list < int > ( "dilations" ) ;
148+ var strides = op . get_attr_list < int > ( "strides" ) ;
149+ var padding = op . get_attr < string > ( "padding" ) ;
150+ var explicit_paddings = op . get_attr_list < int > ( "explicit_paddings" ) ;
151+ var use_cudnn_on_gpu = op . get_attr < bool > ( "use_cudnn_on_gpu" ) ;
152+ var data_format = op . get_attr < string > ( "data_format" ) ;
153+
154+ return new Tensor [ ]
155+ {
156+ gen_nn_ops . conv2d_backprop_filter ( grad , array_ops . shape ( op . inputs [ 1 ] ) , op . inputs [ 2 ] ,
157+ strides , padding ,
158+ use_cudnn_on_gpu : use_cudnn_on_gpu ,
159+ explicit_paddings : explicit_paddings ,
160+ dilations : dilations ,
161+ data_format : data_format ) ,
162+ gen_nn_ops . conv2d ( new Conv2dParams
163+ {
164+ Input = grad ,
165+ Filter = op . inputs [ 1 ] ,
166+ Strides = strides ,
167+ Padding = padding ,
168+ DataFormat = data_format ,
169+ Dilations = dilations ,
170+ ExplicitPaddings = explicit_paddings ,
171+ UseCudnnOnGpu = use_cudnn_on_gpu
172+ } )
173+ } ;
174+ }
175+
136176 /// <summary>
137177 /// Gradient function for Conv2D.
138178 /// </summary>
0 commit comments