[MD] ToTensorOp: Add error msg for unsupported input image types: uint32, int64, uint64, string.

This commit is contained in:
Cathy Wong 2022-06-17 14:03:20 -04:00
parent f0b4ab55bb
commit 427fb21057
3 changed files with 468 additions and 30 deletions

View File

@ -26,6 +26,10 @@ namespace mindspore {
namespace dataset {
Status ToTensorOp::Compute(const std::shared_ptr<Tensor> &input, std::shared_ptr<Tensor> *output) {
IO_CHECK(input, output);
auto input_type = input->type();
CHECK_FAIL_RETURN_UNEXPECTED(input_type != DataType::DE_UINT32 && input_type != DataType::DE_UINT64 &&
input_type != DataType::DE_INT64 && input_type != DataType::DE_STRING,
"ToTensor: Input includes unsupported data type in [uint32, int64, uint64, string].");
// Rescale and convert HWC to CHW format
return ToTensor(input, output, output_type_);
}

View File

@ -30,7 +30,7 @@ SCHEMA_DIR_TF = "../data/dataset/test_tf_file_3_images/datasetSchema.json"
def test_to_tensor_float32():
"""
Feature: ToTensor Op
Description: Test C++ implementation with default float32 output_type
Description: Test ToTensor C++ implementation with default float32 output_type in data pipeline
Expectation: Dataset pipeline runs successfully and results are verified
"""
data1 = ds.MnistDataset(DATA_DIR, num_samples=10, shuffle=False)
@ -57,7 +57,7 @@ def test_to_tensor_float32():
def test_to_tensor_float64():
"""
Feature: ToTensor Op
Description: Test C++ implementation with float64 output_type
Description: Test ToTensor C++ implementation with float64 output_type in data pipeline
Expectation: Dataset pipeline runs successfully and results are verified
"""
data1 = ds.MnistDataset(DATA_DIR, num_samples=10, shuffle=False)
@ -84,7 +84,7 @@ def test_to_tensor_float64():
def test_to_tensor_int32():
"""
Feature: ToTensor Op
Description: Test C++ implementation with int32 output_type
Description: Test ToTensor C++ implementation with int32 output_type in data pipeline
Expectation: Dataset pipeline runs successfully and results are verified
"""
data1 = ds.MnistDataset(DATA_DIR, num_samples=10, shuffle=False)
@ -109,35 +109,10 @@ def test_to_tensor_int32():
np.testing.assert_almost_equal(img3, img1, 5)
def test_to_tensor_eager():
"""
Feature: ToTensor Op
Description: Test C++ implementation with various output_type in eager scenario with float16 image
Expectation: Test runs successfully and results are verified
"""
def test_config(my_np_type):
image = np.random.randn(128, 128, 3).astype(np.float16)
op = vision.ToTensor(output_type=my_np_type)
out = op(image)
image = image / 255
image = image.astype(my_np_type)
image = np.transpose(image, (2, 0, 1))
np.testing.assert_almost_equal(out, image, 5)
test_config(np.float16)
test_config(np.float32)
test_config(np.float64)
test_config(np.int8)
test_config(np.int32)
def test_to_tensor_float16():
"""
Feature: ToTensor Op
Description: Test C++ implementation with float16 output_type
Description: Test ToTensor C++ implementation with float16 output_type in data pipeline
Expectation: Dataset pipeline runs successfully and results are verified
"""
data1 = ds.MnistDataset(DATA_DIR, num_samples=10, shuffle=False)
@ -161,6 +136,202 @@ def test_to_tensor_float16():
np.testing.assert_almost_equal(img3, img1, 3)
def test_to_tensor_float16_eager():
"""
Feature: ToTensor Op
Description: Test ToTensor C++ implementation with float16 image type in eager mode
Expectation: Test runs successfully and results are verified
"""
def test_config(my_output_type, output_dtype, check_image=True):
image = np.random.randn(128, 128, 3).astype(np.float16)
op = vision.ToTensor(output_type=my_output_type)
out = op(image)
assert out.dtype == output_dtype
if check_image:
image = image / 255
image = image.astype(my_output_type)
image = np.transpose(image, (2, 0, 1))
np.testing.assert_almost_equal(out, image, 5)
test_config(np.float16, "float16")
test_config(np.float32, "float32")
test_config(np.float64, "float64")
test_config(np.int8, "int8")
test_config(np.int16, "int16")
test_config(np.int32, "int32")
test_config(np.int64, "int64")
test_config(np.uint8, "uint8")
test_config(np.uint16, "uint16")
test_config(np.uint32, "uint32")
test_config(np.uint64, "uint64")
test_config(np.bool, "bool", False)
def test_to_tensor_float64_eager():
"""
Feature: ToTensor Op
Description: Test ToTensor C++ implementation with float64 image type in eager mode
Expectation: Test runs successfully and results are verified
"""
def test_config(my_output_type, output_dtype):
image = np.random.randn(128, 128, 3).astype(np.float64)
op = vision.ToTensor(output_type=my_output_type)
out = op(image)
assert out.dtype == output_dtype
image = image / 255
image = image.astype(my_output_type)
image = np.transpose(image, (2, 0, 1))
np.testing.assert_almost_equal(out, image, 5)
test_config(np.float16, "float16")
test_config(np.float32, "float32")
test_config(np.float64, "float64")
test_config(np.int8, "int8")
test_config(np.int16, "int16")
test_config(np.int32, "int32")
test_config(np.int64, "int64")
test_config(np.uint8, "uint8")
test_config(np.uint16, "uint16")
test_config(np.uint32, "uint32")
test_config(np.uint64, "uint64")
test_config(np.bool, "bool")
def test_to_tensor_int32_eager():
"""
Feature: ToTensor Op
Description: Test ToTensor C++ implementation with int32 image type in eager mode
Expectation: Test runs successfully and results are verified
"""
def test_config(my_output_type, output_dtype):
image = np.random.randn(128, 128, 3).astype(np.int32)
op = vision.ToTensor(output_type=my_output_type)
out = op(image)
assert out.dtype == output_dtype
image = image / 255
image = image.astype(my_output_type)
image = np.transpose(image, (2, 0, 1))
np.testing.assert_almost_equal(out, image, 5)
test_config(np.float16, "float16")
test_config(np.float32, "float32")
test_config(np.float64, "float64")
test_config(np.int8, "int8")
test_config(np.int16, "int16")
test_config(np.int32, "int32")
test_config(np.int64, "int64")
test_config(np.uint8, "uint8")
test_config(np.uint16, "uint16")
test_config(np.uint32, "uint32")
test_config(np.uint64, "uint64")
test_config(np.bool, "bool")
def test_to_tensor_int64_unsupported():
"""
Feature: ToTensor Op
Description: Test ToTensor C++ implementation with unsupported int64 image type
Expectation: Correct error is thrown as expected
"""
def test_config(my_output_type):
image = np.random.randn(128, 128, 3).astype(np.int64)
with pytest.raises(RuntimeError) as error_info:
op = vision.ToTensor(output_type=my_output_type)
_ = op(image)
error_message = "ToTensor: Input includes unsupported data type in [uint32, int64, uint64, string]."
assert error_message in str(error_info.value)
test_config(np.int8)
test_config(np.int16)
test_config(np.int32)
test_config(np.int64)
test_config(np.uint8)
test_config(np.uint16)
test_config(np.uint32)
test_config(np.uint64)
test_config(np.float32)
def test_to_tensor_uint32_unsupported():
"""
Feature: ToTensor Op
Description: Test ToTensor C++ implementation with unsupported uint32 image type
Expectation: Correct error is thrown as expected
"""
def test_config(my_output_type):
image = np.random.randn(128, 128, 3).astype(np.uint32)
with pytest.raises(RuntimeError) as error_info:
op = vision.ToTensor(output_type=my_output_type)
_ = op(image)
error_message = "ToTensor: Input includes unsupported data type in [uint32, int64, uint64, string]."
assert error_message in str(error_info.value)
test_config(np.int8)
test_config(np.int16)
test_config(np.int32)
test_config(np.int64)
test_config(np.uint8)
test_config(np.uint16)
test_config(np.uint32)
test_config(np.uint64)
test_config(np.float32)
def test_to_tensor_uint64_unsupported():
"""
Feature: ToTensor Op
Description: Test ToTensor C++ implementation with unsupported uint64 image type
Expectation: Correct error is thrown as expected
"""
def test_config(my_output_type):
image = np.random.randn(128, 128, 3).astype(np.uint64)
with pytest.raises(RuntimeError) as error_info:
op = vision.ToTensor(output_type=my_output_type)
_ = op(image)
error_message = "ToTensor: Input includes unsupported data type in [uint32, int64, uint64, string]."
assert error_message in str(error_info.value)
test_config(np.int8)
test_config(np.int16)
test_config(np.int32)
test_config(np.int64)
test_config(np.uint8)
test_config(np.uint16)
test_config(np.uint32)
test_config(np.uint64)
test_config(np.float32)
def test_to_tensor_eager_bool():
"""
Feature: ToTensor Op
Description: Test ToTensor C++ implementation in eager scenario with bool image
Expectation: Test runs successfully and results are verified
"""
image = np.random.randint(0, 255, (128, 128, 3)).astype(np.bool)
my_np_type = np.uint8
op = vision.ToTensor(output_type=my_np_type)
out = op(image)
assert out.dtype == "uint8"
def test_to_tensor_errors():
"""
Feature: ToTensor op
@ -194,10 +365,31 @@ def test_to_tensor_errors():
assert "got an unexpected keyword argument 'data_type'" in str(error_info.value)
def test_to_tensor_eager_error_string():
"""
Feature: ToTensor op
Description: Test ToTensor C++ implementation in eager scenario with string image
Expectation: Correct error is thrown as expected
"""
image = np.random.randint(0, 255, (128, 128, 3)).astype(np.str)
my_np_type = np.uint8
with pytest.raises(RuntimeError) as error_info:
op = vision.ToTensor(output_type=my_np_type)
_ = op(image)
assert "ToTensor: Input includes unsupported data type in [uint32, int64, uint64, string]." in str(error_info.value)
if __name__ == "__main__":
test_to_tensor_float32()
test_to_tensor_float64()
test_to_tensor_int32()
test_to_tensor_eager()
test_to_tensor_float16()
test_to_tensor_float16_eager()
test_to_tensor_float64_eager()
test_to_tensor_int32_eager()
test_to_tensor_int64_unsupported()
test_to_tensor_uint32_unsupported()
test_to_tensor_uint64_unsupported()
test_to_tensor_eager_bool()
test_to_tensor_errors()
test_to_tensor_eager_error_string()

View File

@ -135,6 +135,225 @@ def test_to_tensor_float16():
np.testing.assert_almost_equal(img2, img1, 3)
def test_to_tensor_eager_float16():
"""
Feature: ToTensor Op
Description: Test ToTensor with various supported output_type values in eager scenario with float16 image
Expectation: Test runs successfully and results are verified
"""
def test_config(my_output_type, output_dtype):
image = np.random.randn(128, 128, 3).astype(np.float16)
op = py_vision.ToTensor(output_type=my_output_type)
out = op(image)
assert out.dtype == output_dtype
image = image / 255
image = image.astype(my_output_type)
image = np.transpose(image, (2, 0, 1))
np.testing.assert_almost_equal(out, image, 5)
test_config(np.float16, "float16")
test_config(np.float32, "float32")
test_config(np.float64, "float64")
test_config(np.int8, "int8")
test_config(np.int16, "int16")
test_config(np.int32, "int32")
test_config(np.int64, "int64")
test_config(np.uint8, "uint8")
test_config(np.uint16, "uint16")
test_config(np.uint32, "uint32")
test_config(np.uint64, "uint64")
test_config(np.bool, "bool")
def test_to_tensor_eager_float64():
"""
Feature: ToTensor Op
Description: Test ToTensor with various supported output_type values in eager scenario with float64 image
Expectation: Test runs successfully and results are verified
"""
def test_config(my_output_type, output_dtype):
image = np.random.randn(128, 128, 3).astype(np.float64)
op = py_vision.ToTensor(output_type=my_output_type)
out = op(image)
assert out.dtype == output_dtype
image = image / 255
image = image.astype(my_output_type)
image = np.transpose(image, (2, 0, 1))
np.testing.assert_almost_equal(out, image, 5)
test_config(np.float16, "float16")
test_config(np.float32, "float32")
test_config(np.float64, "float64")
test_config(np.int8, "int8")
test_config(np.int16, "int16")
test_config(np.int32, "int32")
test_config(np.int64, "int64")
test_config(np.uint8, "uint8")
test_config(np.uint16, "uint16")
test_config(np.uint32, "uint32")
test_config(np.uint64, "uint64")
test_config(np.bool, "bool")
def test_to_tensor_eager_int32():
"""
Feature: ToTensor Op
Description: Test ToTensor with various supported output_type values in eager scenario with int32 image
Expectation: Test runs successfully and results are verified
"""
def test_config(my_output_type, output_dtype):
image = np.random.randn(128, 128, 3).astype(np.int32)
op = py_vision.ToTensor(output_type=my_output_type)
out = op(image)
assert out.dtype == output_dtype
image = image / 255
image = image.astype(my_output_type)
image = np.transpose(image, (2, 0, 1))
np.testing.assert_almost_equal(out, image, 5)
test_config(np.float16, "float16")
test_config(np.float32, "float32")
test_config(np.float64, "float64")
test_config(np.int8, "int8")
test_config(np.int16, "int16")
test_config(np.int32, "int32")
test_config(np.int64, "int64")
test_config(np.uint8, "uint8")
test_config(np.uint16, "uint16")
test_config(np.uint32, "uint32")
test_config(np.uint64, "uint64")
test_config(np.bool, "bool")
def test_to_tensor_eager_int64():
"""
Feature: ToTensor Op
Description: Test ToTensor with various supported output_type values in eager scenario with int64 image
Expectation: Test runs successfully and results are verified
"""
def test_config(my_output_type, output_dtype):
image = np.random.randn(128, 128, 3).astype(np.int64)
op = py_vision.ToTensor(output_type=my_output_type)
out = op(image)
assert out.dtype == output_dtype
image = image / 255
image = image.astype(my_output_type)
image = np.transpose(image, (2, 0, 1))
np.testing.assert_almost_equal(out, image, 5)
test_config(np.float16, "float16")
test_config(np.float32, "float32")
test_config(np.float64, "float64")
test_config(np.int8, "int8")
test_config(np.int16, "int16")
test_config(np.int32, "int32")
test_config(np.int64, "int64")
test_config(np.uint8, "uint8")
test_config(np.uint16, "uint16")
test_config(np.uint32, "uint32")
test_config(np.uint64, "uint64")
test_config(np.bool, "bool")
def test_to_tensor_eager_uint32():
"""
Feature: ToTensor Op
Description: Test ToTensor with various supported output_type values in eager scenario with uint32 image
Expectation: Test runs successfully and results are verified
"""
def test_config(my_output_type, output_dtype):
image = np.random.randn(128, 128, 3).astype(np.uint32)
op = py_vision.ToTensor(output_type=my_output_type)
out = op(image)
assert out.dtype == output_dtype
image = image / 255
image = image.astype(my_output_type)
image = np.transpose(image, (2, 0, 1))
np.testing.assert_almost_equal(out, image, 5)
test_config(np.float16, "float16")
test_config(np.float32, "float32")
test_config(np.float64, "float64")
test_config(np.int8, "int8")
test_config(np.int16, "int16")
test_config(np.int32, "int32")
test_config(np.int64, "int64")
test_config(np.uint8, "uint8")
test_config(np.uint16, "uint16")
test_config(np.uint32, "uint32")
test_config(np.uint64, "uint64")
test_config(np.bool, "bool")
def test_to_tensor_eager_uint64():
"""
Feature: ToTensor Op
Description: Test ToTensor with various supported output_type values in eager scenario with uint64 image
Expectation: Test runs successfully and results are verified
"""
def test_config(my_output_type, output_dtype):
image = np.random.randn(128, 128, 3).astype(np.uint64)
op = py_vision.ToTensor(output_type=my_output_type)
out = op(image)
assert out.dtype == output_dtype
image = image / 255
image = image.astype(my_output_type)
image = np.transpose(image, (2, 0, 1))
np.testing.assert_almost_equal(out, image, 5)
test_config(np.float16, "float16")
test_config(np.float32, "float32")
test_config(np.float64, "float64")
test_config(np.int8, "int8")
test_config(np.int16, "int16")
test_config(np.int32, "int32")
test_config(np.int64, "int64")
test_config(np.uint8, "uint8")
test_config(np.uint16, "uint16")
test_config(np.uint32, "uint32")
test_config(np.uint64, "uint64")
test_config(np.bool, "bool")
def test_to_tensor_eager_bool():
"""
Feature: ToTensor Op
Description: Test ToTensor in eager scenario with bool image
Expectation: Test runs successfully and results are verified
"""
image = np.random.randint(0, 255, (128, 128, 3)).astype(np.bool)
my_np_type = np.uint8
op = py_vision.ToTensor(output_type=my_np_type)
out = op(image)
assert out.dtype == "uint8"
def test_to_tensor_errors():
"""
Feature: ToTensor op
@ -177,11 +396,34 @@ def skip_test_to_tensor_errors2():
assert "Argument output_type with value None is not of type" in str(error_info.value)
def test_to_tensor_eager_error_string():
"""
Feature: ToTensor op
Description: Test ToTensor in eager scenario with string image
Expectation: Correct error is thrown as expected
"""
image = np.random.randint(0, 255, (128, 128, 3)).astype(np.str)
my_np_type = np.uint8
with pytest.raises(TypeError) as error_info:
op = py_vision.ToTensor(output_type=my_np_type)
_ = op(image)
assert "ufunc 'true_divide' not supported for the input types" in str(error_info.value)
if __name__ == "__main__":
test_to_tensor_float32()
test_to_tensor_float64()
test_to_tensor_int32()
test_to_tensor_eager()
test_to_tensor_float16()
test_to_tensor_eager_float16()
test_to_tensor_eager_float64()
test_to_tensor_eager_int32()
test_to_tensor_eager_int64()
test_to_tensor_eager_uint32()
test_to_tensor_eager_uint64()
test_to_tensor_eager_int32()
test_to_tensor_eager_bool()
test_to_tensor_errors()
skip_test_to_tensor_errors2()
test_to_tensor_eager_error_string()