summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webnn/validation_tests/convTranspose2d.https.any.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/webnn/validation_tests/convTranspose2d.https.any.js')
-rw-r--r--testing/web-platform/tests/webnn/validation_tests/convTranspose2d.https.any.js470
1 files changed, 470 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webnn/validation_tests/convTranspose2d.https.any.js b/testing/web-platform/tests/webnn/validation_tests/convTranspose2d.https.any.js
index c14f445bf3..02822c5274 100644
--- a/testing/web-platform/tests/webnn/validation_tests/convTranspose2d.https.any.js
+++ b/testing/web-platform/tests/webnn/validation_tests/convTranspose2d.https.any.js
@@ -57,3 +57,473 @@ multi_builder_test(async (t, builder, otherBuilder) => {
assert_throws_js(
TypeError, () => builder.convTranspose2d(input, filter, options));
}, '[convTranspose2d] throw if activation option is from another builder');
+
+const tests = [
+ {
+ name: '[convTranspose2d] Test with default options.',
+ input: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ output: {dataType: 'float32', dimensions: [1, 1, 5, 5]}
+ },
+ {
+ name:
+ '[convTranspose2d] Test with inputLayout="nchw" and filterLayout="hwoi".',
+ input: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ filter: {dataType: 'float32', dimensions: [3, 3, 2, 1]},
+ options: {
+ filterLayout: 'hwoi',
+ inputLayout: 'nchw',
+ },
+ output: {dataType: 'float32', dimensions: [1, 2, 5, 5]}
+ },
+ {
+ name:
+ '[convTranspose2d] Test with inputLayout="nchw" and filterLayout="ohwi".',
+ input: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ filter: {dataType: 'float32', dimensions: [2, 3, 3, 1]},
+ options: {
+ filterLayout: 'ohwi',
+ inputLayout: 'nchw',
+ },
+ output: {dataType: 'float32', dimensions: [1, 2, 5, 5]}
+ },
+ {
+ name:
+ '[convTranspose2d] Test with inputLayout="nhwc" and filterLayout="iohw".',
+ input: {dataType: 'float32', dimensions: [1, 3, 3, 1]},
+ filter: {dataType: 'float32', dimensions: [1, 2, 3, 3]},
+ options: {
+ filterLayout: 'iohw',
+ inputLayout: 'nhwc',
+ },
+ output: {dataType: 'float32', dimensions: [1, 5, 5, 2]}
+ },
+ {
+ name:
+ '[convTranspose2d] Test with inputLayout="nhwc" and filterLayout="hwoi".',
+ input: {dataType: 'float32', dimensions: [1, 3, 3, 1]},
+ filter: {dataType: 'float32', dimensions: [3, 3, 2, 1]},
+ options: {
+ filterLayout: 'hwoi',
+ inputLayout: 'nhwc',
+ },
+ output: {dataType: 'float32', dimensions: [1, 5, 5, 2]}
+ },
+ {
+ name:
+ '[convTranspose2d] Test with inputLayout="nhwc" and filterLayout="ohwi".',
+ input: {dataType: 'float32', dimensions: [1, 3, 3, 1]},
+ filter: {dataType: 'float32', dimensions: [2, 3, 3, 1]},
+ options: {
+ filterLayout: 'ohwi',
+ inputLayout: 'nhwc',
+ },
+ output: {dataType: 'float32', dimensions: [1, 5, 5, 2]}
+ },
+ {
+ name: '[convTranspose2d] Test with strides=[3, 2], outputSizes=[10, 8].',
+ input: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ filter: {dataType: 'float32', dimensions: [1, 2, 3, 3]},
+ options: {
+ strides: [3, 2],
+ outputSizes: [10, 8],
+ },
+ output: {dataType: 'float32', dimensions: [1, 2, 10, 8]}
+ },
+ {
+ name: '[convTranspose2d] Test with strides=[3, 2], outputPadding=[1, 1].',
+ input: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ filter: {dataType: 'float32', dimensions: [1, 2, 3, 3]},
+ options: {
+ strides: [3, 2],
+ outputPadding: [1, 1],
+ },
+ output: {dataType: 'float32', dimensions: [1, 2, 10, 8]}
+ },
+ {
+ name: '[convTranspose2d] Test with padding=1.',
+ input: {dataType: 'float32', dimensions: [1, 1, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ options: {
+ padding: [1, 1, 1, 1],
+ },
+ output: {dataType: 'float32', dimensions: [1, 1, 5, 5]}
+ },
+ {
+ name: '[convTranspose2d] Test with padding=1, groups=3.',
+ input: {dataType: 'float32', dimensions: [1, 1, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ options: {
+ padding: [1, 1, 1, 1],
+ groups: 3,
+ },
+ output: {dataType: 'float32', dimensions: [1, 3, 5, 5]}
+ },
+ {
+ name: '[convTranspose2d] Test with strides=2.',
+ input: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ filter: {dataType: 'float32', dimensions: [1, 2, 3, 3]},
+ options: {
+ strides: [2, 2],
+ },
+ output: {dataType: 'float32', dimensions: [1, 2, 7, 7]}
+ },
+ {
+ name: '[convTranspose2d] Test with strides=2 and padding=1.',
+ input: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ options: {
+ padding: [1, 1, 1, 1],
+ strides: [2, 2],
+ },
+ output: {dataType: 'float32', dimensions: [1, 1, 5, 5]}
+ },
+ {
+ name:
+ '[convTranspose2d] Test when the output sizes are explicitly specified, the output padding values are ignored though padding value is not smaller than stride along the same axis.',
+ input: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ filter: {dataType: 'float32', dimensions: [1, 2, 3, 3]},
+ options: {
+ outputPadding: [3, 3],
+ strides: [3, 2],
+ outputSizes: [10, 8],
+ },
+ output: {dataType: 'float32', dimensions: [1, 2, 10, 8]}
+ },
+ {
+ name: '[convTranspose2d] Throw if the input is not a 4-D tensor.',
+ input: {dataType: 'float32', dimensions: [1, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 2, 2]},
+ },
+ {
+ name:
+ '[convTranspose2d] Throw if the input data type is not floating point.',
+ input: {dataType: 'int32', dimensions: [1, 1, 5, 5]},
+ filter: {dataType: 'int32', dimensions: [1, 1, 2, 2]},
+ },
+ {
+ name: '[convTranspose2d] Throw if the filter is not a 4-D tensor.',
+ input: {dataType: 'float32', dimensions: [1, 1, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [2, 2]},
+ },
+ {
+ name:
+ '[convTranspose2d] Throw if the filter data type doesn\'t match the input data type.',
+ input: {dataType: 'float32', dimensions: [1, 1, 5, 5]},
+ filter: {dataType: 'int32', dimensions: [1, 1, 2, 2]},
+ },
+ {
+ name: '[convTranspose2d] Throw if the length of padding is not 4.',
+ input: {dataType: 'float32', dimensions: [1, 1, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 2, 2]},
+ options: {
+ padding: [2, 2],
+ },
+ },
+ {
+ name: '[convTranspose2d] Throw if the length of strides is not 2.',
+ input: {dataType: 'float32', dimensions: [1, 1, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 2, 2]},
+ options: {
+ strides: [2],
+ },
+ },
+ {
+ name: '[convTranspose2d] Throw if one stride value is smaller than 1.',
+ input: {dataType: 'float32', dimensions: [1, 1, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 2, 2]},
+ options: {
+ strides: [1, 0],
+ },
+ },
+ {
+ name: '[convTranspose2d] Throw if the length of dilations is not 2.',
+ input: {dataType: 'float32', dimensions: [1, 1, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 2, 2]},
+ options: {
+ dilations: [1],
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw if the one dilation value is smaller than 1.',
+ input: {dataType: 'float32', dimensions: [1, 1, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 2, 2]},
+ options: {
+ dilations: [1, 0],
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw if the input channels is not equal to the filter input channels with inputLayout="nchw" and filterLayout="iohw".',
+ input: {dataType: 'float32', dimensions: [1, 3, 3, 3]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ options: {
+ filterLayout: 'iohw',
+ inputLayout: 'nchw',
+ groups: 1,
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw if the input channels is not equal to the filter input channels with inputLayout="nchw" and filterLayout="hwoi".',
+ input: {dataType: 'float32', dimensions: [1, 3, 3, 3]},
+ filter: {dataType: 'float32', dimensions: [3, 1, 2, 1]},
+ options: {
+ filterLayout: 'hwoi',
+ inputLayout: 'nchw',
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw if the input channels is not equal to the filter input channels with inputLayout="nchw" and filterLayout="ohwi".',
+ input: {dataType: 'float32', dimensions: [1, 2, 3, 3]},
+ filter: {dataType: 'float32', dimensions: [2, 3, 3, 1]},
+ options: {
+ filterLayout: 'ohwi',
+ inputLayout: 'nchw',
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw if the input channels is not equal to the filter input channels with inputLayout="nhwc" and filterLayout="iohw".',
+ input: {dataType: 'float32', dimensions: [1, 3, 3, 2]},
+ filter: {dataType: 'float32', dimensions: [1, 2, 3, 3]},
+ options: {
+ filterLayout: 'iohw',
+ inputLayout: 'nhwc',
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw if the input channels is not equal to the filter input channels inputLayout="nhwc" and filterLayout="hwoi".',
+ input: {dataType: 'float32', dimensions: [1, 3, 3, 2]},
+ filter: {dataType: 'float32', dimensions: [3, 3, 2, 1]},
+ options: {
+ filterLayout: 'hwoi',
+ inputLayout: 'nhwc',
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw if the input channels is not equal to the filter input channels with inputLayout="nhwc" and filterLayout="ohwi".',
+ input: {dataType: 'float32', dimensions: [1, 3, 3, 2]},
+ filter: {dataType: 'float32', dimensions: [2, 3, 3, 1]},
+ options: {
+ filterLayout: 'ohwi',
+ inputLayout: 'nhwc',
+ },
+ },
+ {
+ name: '[convTranspose2d] Throw if output channels is too large.',
+ input: {dataType: 'float32', dimensions: [1, 4, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [4, 2, 2, 2]},
+ options: {
+ groups: kMaxUnsignedLong,
+ },
+ },
+ {
+ name: '[convTranspose2d] Throw if the groups is smaller than 1.',
+ input: {dataType: 'float32', dimensions: [1, 4, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 2, 2]},
+ options: {
+ groups: 0,
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw due to overflow when calculating the effective filter height.',
+ input: {dataType: 'float32', dimensions: [1, 1, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 434983, 2]},
+ options: {
+ dilations: [328443, 1],
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw due to overflow when calculating the effective filter width.',
+ input: {dataType: 'float32', dimensions: [1, 1, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 2, 234545]},
+ options: {
+ dilations: [2, 843452],
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw due to overflow when dilation height is too large.',
+ input: {dataType: 'float32', dimensions: [1, 1, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 3, 2]},
+ options: {
+ dilations: [kMaxUnsignedLong, 1],
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw due to overflow when dilation width is too large.',
+ input: {dataType: 'float32', dimensions: [1, 1, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 3, 2]},
+ options: {
+ dilations: [1, kMaxUnsignedLong],
+ },
+ },
+ {
+ name: '[convTranspose2d] Throw if the bias is not a 1-D tensor.',
+ input: {dataType: 'float32', dimensions: [1, 1, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 2, 2]},
+ options: {
+ bias: {dataType: 'float32', dimensions: [1, 2]},
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw if the bias shape is not equal to [output_channels] with filterLayout="iohw".',
+ input: {dataType: 'float32', dimensions: [1, 1, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 2, 2]},
+ options: {
+ filterLayout: 'iohw',
+ bias: {dataType: 'float32', dimensions: [2]},
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw if the bias shape is not equal to [output_channels] with filterLayout="hwoi".',
+ input: {dataType: 'float32', dimensions: [1, 1, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [2, 2, 1, 1]},
+ options: {
+ filterLayout: 'hwoi',
+ bias: {dataType: 'float32', dimensions: [2]},
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw if the bias shape is not equal to [output_channels] with filterLayout="ohwi".',
+ input: {dataType: 'float32', dimensions: [1, 1, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [1, 2, 2, 1]},
+ options: {
+ filterLayout: 'ohwi',
+ bias: {dataType: 'float32', dimensions: [2]},
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw if the bias data type doesn\'t match input data type.',
+ input: {dataType: 'float32', dimensions: [1, 1, 5, 5]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 2, 2]},
+ options: {
+ bias: {dataType: 'int32', dimensions: [1]},
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw if the outputPadding is not a sequence of length 2.',
+ input: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ filter: {dataType: 'float32', dimensions: [1, 2, 3, 3]},
+ options: {
+ strides: [3, 2],
+ outputPadding: [1, 1, 1, 1],
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw if the outputPadding is not smaller than stride along the width dimension.',
+ input: {dataType: 'float32', dimensions: [1, 1, 2, 2]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ options: {
+ padding: [0, 0, 3, 3],
+ strides: [2, 2],
+ outputPadding: [0, 2],
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw if the outputPadding is not smaller than stride along the height dimension.',
+ input: {dataType: 'float32', dimensions: [1, 1, 2, 2]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ options: {
+ padding: [0, 0, 3, 3],
+ strides: [2, 2],
+ outputPadding: [2, 0],
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw if the outputSizes is not a sequence of length 2.',
+ input: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ filter: {dataType: 'float32', dimensions: [1, 2, 3, 3]},
+ options: {
+ strides: [3, 2],
+ outputSizes: [1, 2, 10, 8],
+ },
+ },
+ {
+ name: '[convTranspose2d] Throw if the padding height is too large.',
+ input: {dataType: 'float32', dimensions: [1, 1, 2, 2]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ options: {
+ padding: [4, 4, 0, 0],
+ strides: [2, 2],
+ outputPadding: [1, 0],
+ },
+ },
+ {
+ name: '[convTranspose2d] Throw if the padding width is too large.',
+ input: {dataType: 'float32', dimensions: [1, 1, 2, 2]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ options: {
+ padding: [0, 0, 4, 4],
+ strides: [2, 2],
+ outputPadding: [0, 1],
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw due to outputSizes values are smaller than the output sizes calculated by not using outputPadding.',
+ input: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ options: {
+ padding: [1, 1, 1, 1],
+ strides: [2, 2],
+ outputSizes: [4, 4],
+ outputPadding: [1, 1],
+ },
+ },
+ {
+ name:
+ '[convTranspose2d] Throw due to outputSizes values are greater than the output sizes calculated by not using outputPadding.',
+ input: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ filter: {dataType: 'float32', dimensions: [1, 1, 3, 3]},
+ options: {
+ padding: [1, 1, 1, 1],
+ strides: [2, 2],
+ outputSizes: [6, 8],
+ outputPadding: [1, 1],
+ },
+ },
+];
+
+tests.forEach(
+ test => promise_test(async t => {
+ const input = builder.input(
+ 'input',
+ {dataType: test.input.dataType, dimensions: test.input.dimensions});
+ const filter = builder.input(
+ 'filter',
+ {dataType: test.filter.dataType, dimensions: test.filter.dimensions});
+
+ if (test.options && test.options.bias) {
+ test.options.bias = builder.input('bias', {
+ dataType: test.options.bias.dataType,
+ dimensions: test.options.bias.dimensions
+ });
+ }
+
+ if (test.output) {
+ const output = builder.convTranspose2d(input, filter, test.options);
+ assert_equals(output.dataType(), test.output.dataType);
+ assert_array_equals(output.shape(), test.output.dimensions);
+ } else {
+ assert_throws_js(
+ TypeError,
+ () => builder.convTranspose2d(input, filter, test.options));
+ }
+ }, test.name));