Skip to content

Commit

Permalink
Merge pull request #29176 from reedwm/cherrypick_explicit_2nd_order
Browse files Browse the repository at this point in the history
1.14-rc1 cherry-pick request: Support explicit padding in conv2d second order gradients.
  • Loading branch information
bananabowl committed May 31, 2019
2 parents 1f39eeb + eb9b076 commit d841fd5
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 6 deletions.
14 changes: 12 additions & 2 deletions tensorflow/python/kernel_tests/conv2d_backprop_filter_grad_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,12 @@ class Conv2DBackpropFilterGradTest(test.TestCase):
@test_util.run_deprecated_v1
def testGradient(self):
with self.cached_session():
for padding in ["SAME", "VALID"]:
for padding in [
"SAME",
"VALID",
[(0, 0), (1, 2), (3, 4), (0, 0)],
[(0, 0), (0, 3), (4, 2), (0, 0)]
]:
for stride in [1, 2]:
np.random.seed(1)
in_shape = [5, 8, 6, 4]
Expand Down Expand Up @@ -70,7 +75,12 @@ def testGradient(self):
def testGradientDilatedConv(self):
if test.is_gpu_available(cuda_only=True):
with self.session(use_gpu=True):
for padding in ["SAME", "VALID"]:
for padding in [
"SAME",
"VALID",
[(0, 0), (3, 5), (2, 1), (0, 0)],
[(0, 0), (5, 2), (5, 1), (0, 0)]
]:
for stride in [1, 2]:
np.random.seed(1)
in_shape = [5, 8, 6, 4]
Expand Down
16 changes: 12 additions & 4 deletions tensorflow/python/ops/nn_grad.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,46 +40,54 @@ def _Conv2DBackpropInputGrad(op, grad):
Returns:
the gradients w.r.t. the input and the filter
"""
# We call the gen_nn_ops backprop functions instead of nn_ops backprop
# functions for performance reasons in Eager mode. See _Conv2DGrad.
return [
None,
nn_ops.conv2d_backprop_filter(
gen_nn_ops.conv2d_backprop_filter(
grad,
array_ops.shape(op.inputs[1]),
op.inputs[2],
dilations=op.get_attr("dilations"),
strides=op.get_attr("strides"),
padding=op.get_attr("padding"),
explicit_paddings=op.get_attr("explicit_paddings"),
use_cudnn_on_gpu=op.get_attr("use_cudnn_on_gpu"),
data_format=op.get_attr("data_format").decode()),
nn_ops.conv2d(
gen_nn_ops.conv2d(
grad,
op.inputs[1],
dilations=op.get_attr("dilations"),
strides=op.get_attr("strides"),
padding=op.get_attr("padding"),
explicit_paddings=op.get_attr("explicit_paddings"),
use_cudnn_on_gpu=op.get_attr("use_cudnn_on_gpu"),
data_format=op.get_attr("data_format").decode())
]


@ops.RegisterGradient("Conv2DBackpropFilter")
def _Conv2DBackpropFilterGrad(op, grad):
# We call the gen_nn_ops backprop functions instead of nn_ops backprop
# functions for performance reasons in Eager mode. See _Conv2DGrad.
return [
nn_ops.conv2d_backprop_input(
gen_nn_ops.conv2d_backprop_input(
array_ops.shape(op.inputs[0]),
grad,
op.inputs[2],
dilations=op.get_attr("dilations"),
strides=op.get_attr("strides"),
padding=op.get_attr("padding"),
explicit_paddings=op.get_attr("explicit_paddings"),
use_cudnn_on_gpu=op.get_attr("use_cudnn_on_gpu"),
data_format=op.get_attr("data_format").decode()), None,
nn_ops.conv2d(
gen_nn_ops.conv2d(
op.inputs[0],
grad,
dilations=op.get_attr("dilations"),
strides=op.get_attr("strides"),
padding=op.get_attr("padding"),
explicit_paddings=op.get_attr("explicit_paddings"),
use_cudnn_on_gpu=op.get_attr("use_cudnn_on_gpu"),
data_format=op.get_attr("data_format").decode())
]
Expand Down

0 comments on commit d841fd5

Please sign in to comment.