# Copyright 2020-2021 Huawei Technologies Co., Ltd # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================ import numpy as np import pytest from mindspore import Tensor from mindspore.ops import composite as C from mindspore.ops.operations import _inner_ops as inner import mindspore.nn as nn import mindspore.context as context def sequence_mask(x, maxlen): return C.sequence_mask(Tensor(x.astype(np.int32)), maxlen) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_sequence_mask_1d(): context.set_context(mode=context.PYNATIVE_MODE, device_target="GPU") a = np.array([2, 3, 1]) maxlen = 4 ms_out = sequence_mask(a, maxlen) expected_out = Tensor(np.array([[True, True, False, False], [True, True, True, False], [True, False, False, False]])) np.testing.assert_array_equal(expected_out.asnumpy(), ms_out.asnumpy()) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_sequence_mask_2d(): context.set_context(mode=context.PYNATIVE_MODE, device_target="GPU") a = np.array([[0, 1, 3, 2], [1, 4, 4, 2]]) maxlen = 6 ms_out = sequence_mask(a, maxlen) expected_out = Tensor(np.array([[[False, False, False, False, False, False], [True, False, False, False, False, False], [True, True, True, False, False, False], [True, True, False, False, False, False]], [[True, False, False, False, False, False], [True, True, True, True, False, False], [True, True, True, True, False, False], [True, True, False, False, False, False]]])) np.testing.assert_array_equal(expected_out.asnumpy(), ms_out.asnumpy()) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_sequence_mask_3d(): context.set_context(mode=context.PYNATIVE_MODE, device_target="GPU") a = np.array([[[2, 2], [1, 1]], [[2, 0], [2, 1]], [[0, 0], [0, 0]]]) maxlen = 2 ms_out = sequence_mask(a, maxlen) expected_out = Tensor(np.array([[[[True, True], [True, True]], [[True, False], [True, False]]], [[[True, True], [False, False]], [[True, True], [True, False]]], [[[False, False], [False, False]], [[False, False], [False, False]]]])) np.testing.assert_array_equal(expected_out.asnumpy(), ms_out.asnumpy()) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_sequence_mask_maxlen_1(): context.set_context(mode=context.PYNATIVE_MODE, device_target="GPU") a = np.array([[[0, 1], [1, 1]], [[1, 0], [1, 1]], [[0, 1], [0, 1]]]) maxlen = 1 ms_out = sequence_mask(a, maxlen) expected_out = Tensor(np.array([[[[False], [True]], [[True], [True,]]], [[[True], [False]], [[True], [True]]], [[[False], [True]], [[False], [True]]]])) np.testing.assert_array_equal(expected_out.asnumpy(), ms_out.asnumpy()) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_sequence_mask_dynamic(): class SequenceMaskDynamicNet1(nn.Cell): def __init__(self, maxlen): super(SequenceMaskDynamicNet1, self).__init__() self.maxlen = maxlen self.convert_to_dynamic_shape = inner.GpuConvertToDynamicShape() def construct(self, x): converted_to_dynamic_shape = self.convert_to_dynamic_shape(x) return C.sequence_mask(converted_to_dynamic_shape, self.maxlen) class SequenceMaskDynamicNet2(nn.Cell): def __init__(self): super(SequenceMaskDynamicNet2, self).__init__() self.convert_to_dynamic_shape = inner.GpuConvertToDynamicShape() def construct(self, x): converted_to_dynamic_shape = self.convert_to_dynamic_shape(x) return C.sequence_mask(converted_to_dynamic_shape) context.set_context(mode=context.GRAPH_MODE, device_target="GPU") sequence_mask_net = SequenceMaskDynamicNet1(4) a = Tensor(np.array([0, 1, 0, 2, 0, 5])) ms_out = sequence_mask_net(a) expected_out = Tensor(np.array([[False, False, False, False], [True, False, False, False], [False, False, False, False], [True, True, False, False], [False, False, False, False], [True, True, True, True]])) np.testing.assert_array_equal(expected_out.asnumpy(), ms_out.asnumpy()) a = Tensor(np.array([[4, 3, 0], [0, 1, 3]])) ms_out = sequence_mask_net(a) expected_out = Tensor(np.array([[[True, True, True, True], [True, True, True, False], [False, False, False, False]], [[False, False, False, False], [True, False, False, False], [True, True, True, False]]])) np.testing.assert_array_equal(expected_out.asnumpy(), ms_out.asnumpy()) net_without_maxlen = SequenceMaskDynamicNet2() context.set_context(mode=context.GRAPH_MODE, device_target="GPU") a = np.array([2, 3, 1]) ms_out = net_without_maxlen(Tensor(a)) expected_out = Tensor(np.array([[True, True, False], [True, True, True], [True, False, False]])) np.testing.assert_array_equal(expected_out.asnumpy(), ms_out.asnumpy()) def sequence_mask_optional(x): return C.sequence_mask(Tensor(x.astype(np.int32))) @pytest.mark.level0 @pytest.mark.platform_x86_gpu_training @pytest.mark.env_onecard def test_sequence_mask_optional_maxlen(): context.set_context(mode=context.GRAPH_MODE, device_target="GPU") a = np.array([2, 3, 1]) ms_out = sequence_mask_optional(a) expected_out = Tensor(np.array([[True, True, False], [True, True, True], [True, False, False]])) np.testing.assert_array_equal(expected_out.asnumpy(), ms_out.asnumpy()) context.set_context(mode=context.PYNATIVE_MODE, device_target="GPU") a = np.array([2, 3, 1]) ms_out = sequence_mask_optional(a) expected_out = Tensor(np.array([[True, True, False], [True, True, True], [True, False, False]])) np.testing.assert_array_equal(expected_out.asnumpy(), ms_out.asnumpy())