11
11
import numpy as np
12
12
from onnx import helper , numpy_helper , TensorProto , OperatorSetIdProto
13
13
from parameterized import parameterized
14
+
14
15
from backend_test_base import Tf2OnnxBackendTestBase
15
16
from common import unittest_main , group_nodes_by_type , check_opset_min_version , check_opset_max_version , get_test_config
16
17
from tf2onnx import utils , constants
@@ -309,21 +310,31 @@ def test_transpose_dequantize_with_axis(self, shape, perm_input, perm_output):
309
310
model_proto , remaining_transpose_num = 0 )
310
311
311
312
@parameterized .expand ([
312
- ((2 , 3 , 4 , 5 ), [1 , 2 , 1 , 2 ], (1 , 2 , 2 , 1 ), [0 , 2 , 3 , 1 ], [0 , 3 , 1 , 2 ]),
313
- ((2 , 3 , 4 , 5 , 6 ), [1 , 2 , 1 , 2 , 1 ], (1 , 1 , 2 , 1 , 2 ), [0 , 2 , 3 , 4 , 1 ], [0 , 4 , 1 , 2 , 3 ]),
313
+ ([2 , 3 , 4 , 5 ], [1 , 2 , 1 , 2 ], [1 ], [0 , 2 , 3 , 1 ], [0 , 3 , 1 , 2 ]),
314
+ ([2 , 3 , 4 , 5 ], [1 , 2 , 1 , 2 ], [1 , 2 ], [0 , 2 , 3 , 1 ], [0 , 3 , 1 , 2 ]),
315
+ ([2 , 3 , 4 , 5 ], [1 , 2 , 1 , 2 ], [0 , 1 , 2 , 3 ], [0 , 2 , 3 , 1 ], [0 , 3 , 1 , 2 ]),
316
+ ([2 , 3 , 4 , 5 , 6 ], [1 , 2 , 1 , 2 , 1 ], [2 ], [0 , 2 , 3 , 4 , 1 ], [0 , 4 , 1 , 2 , 3 ]),
317
+ ([2 , 3 , 4 , 5 , 6 ], [1 , 2 , 1 , 2 , 1 ], [2 , 3 ], [0 , 2 , 3 , 4 , 1 ], [0 , 4 , 1 , 2 , 3 ]),
318
+ ([2 , 3 , 4 , 5 , 6 ], [1 , 2 , 1 , 2 , 1 ], [0 , 1 , 2 , 3 , 4 ], [0 , 2 , 3 , 4 , 1 ], [0 , 4 , 1 , 2 , 3 ]),
314
319
])
315
- @check_opset_min_version (10 , "Slice in opset 10 can accept dymaic 'start' and 'ends'" )
316
- def test_transpose_slice (self , input_shape , slice_size , output_shape , perm_input , perm_output ):
317
- starts = np .array ([0 ] * len (input_shape ), dtype = np .int64 )
318
- ends = np .array (slice_size , dtype = np .int64 )
319
- axes = np .array (list (range (len (input_shape ))), dtype = np .int64 )
320
+ @check_opset_max_version (9 , "Slice in opset 9 and takes 'axes, 'start' and 'ends' as attributes" )
321
+ def test_transpose_slice (self , input_shape , slice_size , axes , perm_input , perm_output ):
322
+ axes = np .array (axes , dtype = np .int64 )
323
+ starts = np .array ([0 ] * axes .size , dtype = np .int64 )
324
+ ends = []
325
+ for i in range (axes .size ):
326
+ ends .append (slice_size [axes [i ]])
327
+ ends = np .array (ends , dtype = np .int64 )
328
+ output_shape = input_shape .copy ()
329
+ for axis in axes :
330
+ output_shape [perm_input [axis ]] = slice_size [axis ]
320
331
node1 = helper .make_node ("Transpose" , ["X" ], ["Y" ], perm = perm_input , name = "trans_1" )
321
- node2 = helper .make_node ("Slice" , ["Y" , "starts" , " ends" , " axes" ], [ "Z" ], name = "relu " )
332
+ node2 = helper .make_node ("Slice" , ["Y" ], [ "Z" ], starts = starts , ends = ends , axes = axes , name = "slice " )
322
333
node3 = helper .make_node ("Transpose" , ["Z" ], ["Z1" ], perm = perm_output , name = "trans_2" )
323
334
324
335
graph = helper .make_graph (
325
336
[node1 , node2 , node3 ],
326
- "relu -test" ,
337
+ "slice -test" ,
327
338
[helper .make_tensor_value_info ("X" , TensorProto .FLOAT , input_shape )],
328
339
[helper .make_tensor_value_info ("Z1" , TensorProto .FLOAT , output_shape )],
329
340
[
@@ -337,6 +348,45 @@ def test_transpose_slice(self, input_shape, slice_size, output_shape, perm_input
337
348
self .run_transpose_compare (["Z1" ], {"X" : np .random .randn (* input_shape ).astype (np .float32 )},
338
349
model_proto , remaining_transpose_num = 0 )
339
350
351
+ @parameterized .expand ([
352
+ ([2 , 3 , 4 , 5 ], [1 , 2 , 1 , 2 ], [1 ], [0 , 2 , 3 , 1 ], [0 , 3 , 1 , 2 ]),
353
+ ([2 , 3 , 4 , 5 ], [1 , 2 , 1 , 2 ], [1 , 2 ], [0 , 2 , 3 , 1 ], [0 , 3 , 1 , 2 ]),
354
+ ([2 , 3 , 4 , 5 ], [1 , 2 , 1 , 2 ], [0 , 1 , 2 , 3 ], [0 , 2 , 3 , 1 ], [0 , 3 , 1 , 2 ]),
355
+ ([2 , 3 , 4 , 5 , 6 ], [1 , 2 , 1 , 2 , 1 ], [2 ], [0 , 2 , 3 , 4 , 1 ], [0 , 4 , 1 , 2 , 3 ]),
356
+ ([2 , 3 , 4 , 5 , 6 ], [1 , 2 , 1 , 2 , 1 ], [2 , 3 ], [0 , 2 , 3 , 4 , 1 ], [0 , 4 , 1 , 2 , 3 ]),
357
+ ([2 , 3 , 4 , 5 , 6 ], [1 , 2 , 1 , 2 , 1 ], [0 , 1 , 2 , 3 , 4 ], [0 , 2 , 3 , 4 , 1 ], [0 , 4 , 1 , 2 , 3 ]),
358
+ ])
359
+ @check_opset_min_version (10 , "Slice in opset 10 can accept dynamic 'start' and 'ends'" )
360
+ def test_transpose_slice_opset_10 (self , input_shape , slice_size , axes , perm_input , perm_output ):
361
+ axes = np .array (axes , dtype = np .int32 )
362
+ starts = np .array ([0 ] * axes .size , dtype = np .int32 )
363
+ ends = []
364
+ for i in range (axes .size ):
365
+ ends .append (slice_size [axes [i ]])
366
+ ends = np .array (ends , dtype = np .int32 )
367
+ output_shape = input_shape .copy ()
368
+ for axis in axes :
369
+ output_shape [perm_input [axis ]] = slice_size [axis ]
370
+ node1 = helper .make_node ("Transpose" , ["X" ], ["Y" ], perm = perm_input , name = "trans_1" )
371
+ node2 = helper .make_node ("Slice" , ["Y" , "starts" , "ends" , "axes" ], ["Z" ], name = "slice" )
372
+ node3 = helper .make_node ("Transpose" , ["Z" ], ["Z1" ], perm = perm_output , name = "trans_2" )
373
+
374
+ graph = helper .make_graph (
375
+ [node1 , node2 , node3 ],
376
+ "slice-test" ,
377
+ [helper .make_tensor_value_info ("X" , TensorProto .FLOAT , input_shape )],
378
+ [helper .make_tensor_value_info ("Z1" , TensorProto .FLOAT , output_shape )],
379
+ [
380
+ helper .make_tensor ("starts" , TensorProto .INT32 , starts .shape , starts ),
381
+ helper .make_tensor ("ends" , TensorProto .INT32 , ends .shape , ends ),
382
+ helper .make_tensor ("axes" , TensorProto .INT32 , axes .shape , axes )
383
+ ]
384
+ )
385
+
386
+ model_proto = self .make_model (graph , producer_name = "onnx-tests" )
387
+ self .run_transpose_compare (["Z1" ], {"X" : np .random .randn (* input_shape ).astype (np .float32 )},
388
+ model_proto , remaining_transpose_num = 0 )
389
+
340
390
@parameterized .expand ([
341
391
((2 , 3 , 4 , 5 ), (2 , 4 , 5 , 3 ), [0 , 2 , 3 , 1 ], [0 , 3 , 1 , 2 ]),
342
392
((2 , 3 , 4 , 5 , 6 ), (2 , 4 , 5 , 6 , 3 ), [0 , 2 , 3 , 4 , 1 ], [0 , 4 , 1 , 2 , 3 ]),
0 commit comments