This is an automated email from the ASF dual-hosted git repository. zhaowu pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-tvm.git
The following commit(s) were added to refs/heads/master by this push: new c97e41b [FRONTEND][KERAS]Max_pool3d and Averagepool3d operator support (#5085) c97e41b is described below commit c97e41b0c079c1181541501b14151be7499eccb9 Author: Samuel <siju.sam...@huawei.com> AuthorDate: Tue Mar 31 14:11:41 2020 +0530 [FRONTEND][KERAS]Max_pool3d and Averagepool3d operator support (#5085) * [KERAS]Pool3d support added * Keras pool3d testcase added --- python/tvm/relay/frontend/keras.py | 41 +++++++++++++++++++++++++++-- tests/python/frontend/keras/test_forward.py | 23 ++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/python/tvm/relay/frontend/keras.py b/python/tvm/relay/frontend/keras.py index f5f9ad5..7c189f2 100644 --- a/python/tvm/relay/frontend/keras.py +++ b/python/tvm/relay/frontend/keras.py @@ -510,6 +510,43 @@ def _convert_pooling(inexpr, keras_layer, etab): raise tvm.error.OpNotImplemented( 'Operator {} is not supported for frontend Keras.'.format(keras_layer)) +def _convert_pooling3d(inexpr, keras_layer, etab): + _check_data_format(keras_layer) + pool_type = type(keras_layer).__name__ + + if pool_type not in ['MaxPooling3D', 'AveragePooling3D']: + raise tvm.error.OpNotImplemented( + 'Operator {} is not supported for frontend Keras.'.format(keras_layer)) + + pool_d1, pool_d2, pool_d3 = keras_layer.pool_size + stride_d1, stride_d2, stride_d3 = keras_layer.strides + params = {'pool_size': [pool_d1, pool_d2, pool_d3], + 'strides': [stride_d1, stride_d2, stride_d3], + 'padding': [0, 0, 0], + 'layout': etab.data_layout} + + if keras_layer.padding == 'valid': + pass + elif keras_layer.padding == 'same': + in_d1 = keras_layer.input_shape[1] + in_d2 = keras_layer.input_shape[2] + in_d3 = keras_layer.input_shape[3] + pad_d1 = _get_pad_pair(in_d1, pool_d1, stride_d1) + pad_d2 = _get_pad_pair(in_d2, pool_d2, stride_d2) + pad_d3 = _get_pad_pair(in_d3, pool_d3, stride_d3) + params['padding'] = [pad_d1[0], pad_d2[0], pad_d3[0], pad_d1[1], pad_d2[1], pad_d3[1]] + else: + raise tvm.error.OpAttributeUnImplemented( + 'Padding with {} is not supported in operator Pooling3D.'.format(keras_layer.padding)) + + out = _op.transpose(inexpr, axes=(0, 4, 1, 2, 3)) + params['layout'] = "NCDHW" + if pool_type == 'MaxPooling3D': + out = _op.nn.max_pool3d(out, **params) + elif pool_type == 'AveragePooling3D': + out = _op.nn.avg_pool3d(out, **params) + + return _op.transpose(out, axes=(0, 2, 3, 4, 1)) def _convert_upsample(inexpr, keras_layer, etab): _check_data_format(keras_layer) @@ -817,8 +854,8 @@ _convert_map = { 'Conv3D' : _convert_convolution3d, # 'Conv3DTranspose' : _convert_convolution3d, # 'SeparableConv3D' : _convert_convolution3d, - # 'MaxPooling3D' : _convert_pooling3d, - # 'AveragePooling3D' : _convert_pooling3d, + 'MaxPooling3D' : _convert_pooling3d, + 'AveragePooling3D' : _convert_pooling3d, # 'GlobalMaxPooling3D' : _convert_pooling3d, # 'GlobalAveragePooling3D' : _convert_pooling3d, # 'UpSampling3D' : _convert_upsample3d, diff --git a/tests/python/frontend/keras/test_forward.py b/tests/python/frontend/keras/test_forward.py index 57f6401..5f4bcb1 100644 --- a/tests/python/frontend/keras/test_forward.py +++ b/tests/python/frontend/keras/test_forward.py @@ -421,6 +421,28 @@ class TestKeras: keras_model = keras.models.Model(data, x) verify_keras_frontend(keras_model, layout='NDHWC') + def test_forward_pool3d(self, keras): + data = keras.layers.Input(shape=(32, 32, 32, 1)) + pool_funcs = [# maxpool + keras.layers.MaxPooling3D(pool_size=(2, 2, 2), + strides=(1, 1, 1), + padding='same'), + keras.layers.MaxPooling3D(pool_size=(3, 3, 3), + strides=(2, 2, 2), + padding='valid'), + # avgpool + keras.layers.AveragePooling3D(pool_size=(3, 3, 3), + strides=(2, 2, 2), + padding='same'), + keras.layers.AveragePooling3D(pool_size=(2, 2, 2), + strides=(1, 1, 1), + padding='valid'), + ] + for pool_func in pool_funcs: + x = pool_func(data) + keras_model = keras.models.Model(data, x) + verify_keras_frontend(keras_model, layout='NDHWC') + if __name__ == '__main__': for k in [keras, tf_keras]: sut = TestKeras() @@ -449,3 +471,4 @@ if __name__ == '__main__': sut.test_forward_mobilenet(keras=k) sut.test_forward_mobilenet(keras=k, layout='NHWC') sut.test_forward_conv3d(keras=k) + sut.test_forward_pool3d(keras=k)