-
Notifications
You must be signed in to change notification settings - Fork 74.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Added atrous_conv1d and 3d. Refactored 2d. #7545
Changes from 4 commits
6e11066
6d182be
2c08ba7
bd8fef2
443ae29
2cd78a9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -805,9 +805,14 @@ def op(converted_input, _, converted_padding): # pylint: disable=missing-docstr | |
filter_shape=window_shape) | ||
|
||
|
||
def atrous_conv2d(value, filters, rate, padding, name=None): | ||
def atrous_conv2d(value, filters, rate, padding, strides=None, name=None): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not clear if it makes sense to add strides, since it is supported by the more generic convolution anyway, but if it is added, it should be documented in the Args section. |
||
"""Atrous convolution (a.k.a. convolution with holes or dilated convolution). | ||
|
||
This function is a simpler wrapper around the more general | ||
@{tf.nn.convolution}, and exists only for backwards compatibility. You can | ||
use @{tf.nn.convolution} to perform 1-D, 2-D, or 3-D atrous convolution. | ||
|
||
|
||
Computes a 2-D atrous convolution, also known as convolution with holes or | ||
dilated convolution, given 4-D `value` and `filters` tensors. If the `rate` | ||
parameter is equal to one, it performs regular 2-D convolution. If the `rate` | ||
|
@@ -903,7 +908,8 @@ def atrous_conv2d(value, filters, rate, padding, name=None): | |
the `height` and `width` dimensions. Equivalently, the rate by which we | ||
upsample the filter values by inserting zeros across the `height` and | ||
`width` dimensions. In the literature, the same parameter is sometimes | ||
called `input stride` or `dilation`. | ||
called `input stride` or `dilation`. Alternatively it could be 3 element | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This should be "2 element". |
||
sequence denoting dilation rate in each dimension. | ||
padding: A string, either `'VALID'` or `'SAME'`. The padding algorithm. | ||
name: Optional name for the returned tensor. | ||
|
||
|
@@ -914,93 +920,9 @@ def atrous_conv2d(value, filters, rate, padding, name=None): | |
ValueError: If input/output depth does not match `filters`' shape, or if | ||
padding is other than `'VALID'` or `'SAME'`. | ||
""" | ||
with ops.name_scope(name, "atrous_conv2d", [value, filters]) as name: | ||
value = ops.convert_to_tensor(value, name="value") | ||
filters = ops.convert_to_tensor(filters, name="filters") | ||
if not value.get_shape()[3].is_compatible_with(filters.get_shape()[2]): | ||
raise ValueError( | ||
"value's input channels does not match filters' input channels, " | ||
"{} != {}".format(value.get_shape()[3], filters.get_shape()[2])) | ||
if rate < 1: | ||
raise ValueError("rate {} cannot be less than one".format(rate)) | ||
|
||
if rate == 1: | ||
value = gen_nn_ops.conv2d(input=value, | ||
filter=filters, | ||
strides=[1, 1, 1, 1], | ||
padding=padding) | ||
return value | ||
|
||
# We have two padding contributions. The first is used for converting "SAME" | ||
# to "VALID". The second is required so that the height and width of the | ||
# zero-padded value tensor are multiples of rate. | ||
|
||
# Padding required to reduce to "VALID" convolution | ||
if padding == "SAME": | ||
# Handle filters whose shape is unknown during graph creation. | ||
if filters.get_shape().is_fully_defined(): | ||
filter_shape = filters.get_shape().as_list() | ||
else: | ||
filter_shape = array_ops.shape(filters) | ||
filter_height, filter_width = filter_shape[0], filter_shape[1] | ||
|
||
# Spatial dimensions of the filters and the upsampled filters in which we | ||
# introduce (rate - 1) zeros between consecutive filter values. | ||
filter_height_up = filter_height + (filter_height - 1) * (rate - 1) | ||
filter_width_up = filter_width + (filter_width - 1) * (rate - 1) | ||
|
||
pad_height = filter_height_up - 1 | ||
pad_width = filter_width_up - 1 | ||
|
||
# When pad_height (pad_width) is odd, we pad more to bottom (right), | ||
# following the same convention as conv2d(). | ||
pad_top = pad_height // 2 | ||
pad_bottom = pad_height - pad_top | ||
pad_left = pad_width // 2 | ||
pad_right = pad_width - pad_left | ||
elif padding == "VALID": | ||
pad_top = 0 | ||
pad_bottom = 0 | ||
pad_left = 0 | ||
pad_right = 0 | ||
else: | ||
raise ValueError("Invalid padding") | ||
|
||
# Handle input whose shape is unknown during graph creation. | ||
if value.get_shape().is_fully_defined(): | ||
value_shape = value.get_shape().as_list() | ||
else: | ||
value_shape = array_ops.shape(value) | ||
|
||
in_height = value_shape[1] + pad_top + pad_bottom | ||
in_width = value_shape[2] + pad_left + pad_right | ||
|
||
# More padding so that rate divides the height and width of the input. | ||
pad_bottom_extra = (rate - in_height % rate) % rate | ||
pad_right_extra = (rate - in_width % rate) % rate | ||
|
||
# The paddings argument to space_to_batch includes both padding components. | ||
space_to_batch_pad = [[pad_top, pad_bottom + pad_bottom_extra], | ||
[pad_left, pad_right + pad_right_extra]] | ||
|
||
value = array_ops.space_to_batch(input=value, | ||
paddings=space_to_batch_pad, | ||
block_size=rate) | ||
|
||
value = gen_nn_ops.conv2d(input=value, | ||
filter=filters, | ||
strides=[1, 1, 1, 1], | ||
padding="VALID", | ||
name=name) | ||
|
||
# The crops argument to batch_to_space is just the extra padding component. | ||
batch_to_space_crop = [[0, pad_bottom_extra], [0, pad_right_extra]] | ||
|
||
value = array_ops.batch_to_space(input=value, | ||
crops=batch_to_space_crop, | ||
block_size=rate) | ||
|
||
return value | ||
return convolution(input=value, filter=filters, padding=padding, | ||
dilation_rate=np.broadcast_to(rate, (2, )), | ||
strides=strides, name=name) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Test failure is caused by reference to undefined variable strides. |
||
|
||
|
||
def conv2d_transpose(value, | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These should be removed.