From 84711475f8db72ac573a2584cb85f8d6ff5facef Mon Sep 17 00:00:00 2001 From: Fred Schroeder Date: Sat, 11 Mar 2017 18:43:31 -0800 Subject: [PATCH] Api conversions/zeropadding cropping (#5723) * Add ZeroPadding2/3D and Cropping2/3D API conversion interfaces. * Add ZeroPadding2/3D and Cropping2/3D API conversion interfaces. --- keras/layers/convolutional.py | 4 ++ keras/legacy/interfaces.py | 58 +++++++++++++++++++++++++++- tests/keras/legacy/interface_test.py | 47 +++++++++++++++++++++- 3 files changed, 105 insertions(+), 4 deletions(-) diff --git a/keras/layers/convolutional.py b/keras/layers/convolutional.py index 7486bf1b6..5f1f15f85 100644 --- a/keras/layers/convolutional.py +++ b/keras/layers/convolutional.py @@ -1289,6 +1289,7 @@ class ZeroPadding2D(Layer): `(batch, channels, padded_rows, padded_cols)` """ + @interfaces.legacy_zeropadding2d_support def __init__(self, padding=(1, 1), data_format=None, @@ -1383,6 +1384,7 @@ class ZeroPadding3D(Layer): `(batch, depth, first_padded_axis, second_padded_axis, third_axis_to_pad)` """ + @interfaces.legacy_zeropadding3d_support def __init__(self, padding=(1, 1, 1), data_format=None, **kwargs): super(ZeroPadding3D, self).__init__(**kwargs) self.data_format = conv_utils.normalize_data_format(data_format) @@ -1542,6 +1544,7 @@ class Cropping2D(Layer): ``` """ + @interfaces.legacy_cropping2d_support def __init__(self, cropping=((0, 0), (0, 0)), data_format=None, **kwargs): super(Cropping2D, self).__init__(**kwargs) @@ -1669,6 +1672,7 @@ class Cropping3D(Layer): `(batch, depth, first_cropped_axis, second_cropped_axis, third_cropped_axis)` """ + @interfaces.legacy_cropping3d_support def __init__(self, cropping=((1, 1), (1, 1), (1, 1)), data_format=None, **kwargs): super(Cropping3D, self).__init__(**kwargs) diff --git a/keras/legacy/interfaces.py b/keras/legacy/interfaces.py index 7d57edc6b..a765535f1 100644 --- a/keras/legacy/interfaces.py +++ b/keras/legacy/interfaces.py @@ -406,7 +406,6 @@ def convlstm2d_args_preprocessor(args, kwargs): args, kwargs, _converted = conv2d_args_preprocessor(args, kwargs) return args, kwargs, converted + _converted - legacy_convlstm2d_support = generate_legacy_interface( allowed_positional_args=['filters', 'kernel_size'], conversions=[('nb_filter', 'filters'), @@ -427,9 +426,64 @@ legacy_convlstm2d_support = generate_legacy_interface( 'default': None}}, preprocessor=convlstm2d_args_preprocessor) - legacy_batchnorm_support = generate_legacy_interface( allowed_positional_args=[], conversions=[('beta_init', 'beta_initializer'), ('gamma_init', 'gamma_initializer')], preprocessor=batchnorm_args_preprocessor) + + +def zeropadding2d_preprocessor(args, kwargs): + converted = [] + if 'padding' in kwargs and isinstance(kwargs['padding'], dict): + if set(kwargs['padding'].keys()) <= {'top_pad', 'bottom_pad', + 'left_pad', 'right_pad'}: + top_pad = kwargs['padding'].get('top_pad', 0) + bottom_pad = kwargs['padding'].get('bottom_pad', 0) + left_pad = kwargs['padding'].get('left_pad', 0) + right_pad = kwargs['padding'].get('right_pad', 0) + kwargs['padding'] = ((top_pad, bottom_pad), (left_pad, right_pad)) + warnings.warn('The `padding` argument in the Keras 2 API no longer' + 'accepts dict types. You can now input argument as: ' + '`padding`=(top_pad, bottom_pad, left_pad, right_pad)') + elif len(args) == 2 and isinstance(args[1], dict): + if set(args[1].keys()) <= {'top_pad', 'bottom_pad', + 'left_pad', 'right_pad'}: + top_pad = args[1].get('top_pad', 0) + bottom_pad = args[1].get('bottom_pad', 0) + left_pad = args[1].get('left_pad', 0) + right_pad = args[1].get('right_pad', 0) + args = (args[0], ((top_pad, bottom_pad), (left_pad, right_pad))) + warnings.warn('The `padding` argument in the Keras 2 API no longer' + 'accepts dict types. You can now input argument as: ' + '`padding`=((top_pad, bottom_pad), (left_pad, right_pad))') + return args, kwargs, converted + +legacy_zeropadding2d_support = generate_legacy_interface( + allowed_positional_args=['padding'], + conversions=[('dim_ordering', 'data_format')], + value_conversions={'dim_ordering': {'tf': 'channels_last', + 'th': 'channels_first', + 'default': None}}, + preprocessor=zeropadding2d_preprocessor) + +legacy_zeropadding3d_support = generate_legacy_interface( + allowed_positional_args=['padding'], + conversions=[('dim_ordering', 'data_format')], + value_conversions={'dim_ordering': {'tf': 'channels_last', + 'th': 'channels_first', + 'default': None}}) + +legacy_cropping2d_support = generate_legacy_interface( + allowed_positional_args=['cropping'], + conversions=[('dim_ordering', 'data_format')], + value_conversions={'dim_ordering': {'tf': 'channels_last', + 'th': 'channels_first', + 'default': None}}) + +legacy_cropping3d_support = generate_legacy_interface( + allowed_positional_args=['cropping'], + conversions=[('dim_ordering', 'data_format')], + value_conversions={'dim_ordering': {'tf': 'channels_last', + 'th': 'channels_first', + 'default': None}}) diff --git a/tests/keras/legacy/interface_test.py b/tests/keras/legacy/interface_test.py index a74b3bd5b..fc8f429b1 100644 --- a/tests/keras/legacy/interface_test.py +++ b/tests/keras/legacy/interface_test.py @@ -388,8 +388,12 @@ def test_upsampling2d_legacy_interface(): @keras_test def test_upsampling3d_legacy_interface(): - old_layer = keras.layers.UpSampling3D((2, 2, 2), dim_ordering='tf', name='us3d') - new_layer = keras.layers.UpSampling3D((2, 2, 2), data_format='channels_last', name='us3d') + old_layer = keras.layers.UpSampling3D((2, 2, 2), + dim_ordering='tf', + name='us3d') + new_layer = keras.layers.UpSampling3D((2, 2, 2), + data_format='channels_last', + name='us3d') assert json.dumps(old_layer.get_config()) == json.dumps(new_layer.get_config()) @@ -706,5 +710,44 @@ def test_atrousconv2d_legacy_interface(): assert json.dumps(old_layer.get_config()) == json.dumps(new_layer.get_config()) +@keras_test +def test_zeropadding2d_legacy_interface(): + old_layer = keras.layers.ZeroPadding2D(padding={'right_pad': 4, + 'bottom_pad': 2, + 'top_pad': 1, + 'left_pad': 3}, + dim_ordering='tf', + name='zp2d') + new_layer = keras.layers.ZeroPadding2D(((1, 2), (3, 4)), + data_format='channels_last', + name='zp2d') + assert json.dumps(old_layer.get_config()) == json.dumps(new_layer.get_config()) + + +@keras_test +def test_zeropadding3d_legacy_interface(): + old_layer = keras.layers.ZeroPadding3D((2, 2, 2), + dim_ordering='tf', + name='zp3d') + new_layer = keras.layers.ZeroPadding3D((2, 2, 2), + data_format='channels_last', + name='zp3d') + assert json.dumps(old_layer.get_config()) == json.dumps(new_layer.get_config()) + + +@keras_test +def test_cropping2d_legacy_interface(): + old_layer = keras.layers.Cropping2D(dim_ordering='tf', name='c2d') + new_layer = keras.layers.Cropping2D(data_format='channels_last', name='c2d') + assert json.dumps(old_layer.get_config()) == json.dumps(new_layer.get_config()) + + +@keras_test +def test_cropping3d_legacy_interface(): + old_layer = keras.layers.Cropping3D(dim_ordering='tf', name='c3d') + new_layer = keras.layers.Cropping3D(data_format='channels_last', name='c3d') + assert json.dumps(old_layer.get_config()) == json.dumps(new_layer.get_config()) + + if __name__ == '__main__': pytest.main([__file__])