@@ -28,12 +28,58 @@ def convert_conv(params, w_name, scope_name, inputs, layers, weights, short_name
28
28
tf_name = 'C' + random_string (7 )
29
29
else :
30
30
tf_name = w_name + str (random .random ())
31
-
31
+
32
32
bias_name = '{0}.bias' .format (w_name )
33
33
weights_name = '{0}.weight' .format (w_name )
34
34
input_name = inputs [0 ]
35
35
36
- if len (weights [weights_name ].numpy ().shape ) == 4 :
36
+ if len (weights [weights_name ].numpy ().shape ) == 5 : # 3D conv
37
+ W = weights [weights_name ].numpy ().transpose (2 , 3 , 4 , 1 , 0 )
38
+ height , width , channels , n_layers , n_filters = W .shape
39
+ print (W .shape )
40
+
41
+ if bias_name in weights :
42
+ biases = weights [bias_name ].numpy ()
43
+ has_bias = True
44
+ else :
45
+ biases = None
46
+ has_bias = False
47
+
48
+ if params ['pads' ][0 ] > 0 or params ['pads' ][1 ] > 0 :
49
+ padding_name = tf_name + '_pad'
50
+ padding_layer = keras .layers .ZeroPadding3D (
51
+ padding = (params ['pads' ][0 ],
52
+ params ['pads' ][1 ],
53
+ params ['pads' ][2 ]),
54
+ name = padding_name
55
+ )
56
+ layers [padding_name ] = padding_layer (layers [input_name ])
57
+ input_name = padding_name
58
+
59
+ weights = None
60
+ if has_bias :
61
+ weights = [W , biases ]
62
+ else :
63
+ weights = [W ]
64
+
65
+ print (len (weights ), len (weights [0 ]), len (weights [0 ][0 ]),
66
+ len (weights [0 ][0 ][0 ]), len (weights [0 ][0 ][0 ][0 ]),
67
+ len (weights [0 ][0 ][0 ][0 ][0 ]))
68
+ conv = keras .layers .Conv3D (
69
+ filters = n_filters ,
70
+ kernel_size = (channels , height , width ),
71
+ strides = (params ['strides' ][0 ],
72
+ params ['strides' ][1 ],
73
+ params ['strides' ][2 ]),
74
+ padding = 'valid' ,
75
+ weights = weights ,
76
+ use_bias = has_bias ,
77
+ activation = None ,
78
+ dilation_rate = params ['dilations' ][0 ],
79
+ name = tf_name
80
+ )
81
+ layers [scope_name ] = conv (layers [input_name ])
82
+ elif len (weights [weights_name ].numpy ().shape ) == 4 : # 2D conv
37
83
W = weights [weights_name ].numpy ().transpose (2 , 3 , 1 , 0 )
38
84
height , width , channels , n_filters = W .shape
39
85
@@ -71,7 +117,7 @@ def convert_conv(params, w_name, scope_name, inputs, layers, weights, short_name
71
117
name = tf_name
72
118
)
73
119
layers [scope_name ] = conv (layers [input_name ])
74
- else :
120
+ else : # 1D conv
75
121
W = weights [weights_name ].numpy ().transpose (2 , 1 , 0 )
76
122
width , channels , n_filters = W .shape
77
123
@@ -333,6 +379,61 @@ def convert_maxpool(params, w_name, scope_name, inputs, layers, weights, short_n
333
379
layers [scope_name ] = pooling (layers [input_name ])
334
380
335
381
382
+ def convert_maxpool3 (params , w_name , scope_name , inputs , layers , weights , short_names ):
383
+ """
384
+ Convert 3d Max pooling.
385
+
386
+ Args:
387
+ params: dictionary with layer parameters
388
+ w_name: name prefix in state_dict
389
+ scope_name: pytorch scope name
390
+ inputs: pytorch node inputs
391
+ layers: dictionary with keras tensors
392
+ weights: pytorch state_dict
393
+ short_names: use short names for keras layers
394
+ """
395
+
396
+ print ('Converting pooling ...' )
397
+
398
+ if short_names :
399
+ tf_name = 'P' + random_string (7 )
400
+ else :
401
+ tf_name = w_name + str (random .random ())
402
+
403
+ if 'kernel_shape' in params :
404
+ height , width , depth = params ['kernel_shape' ]
405
+ else :
406
+ height , width , depth = params ['kernel_size' ]
407
+
408
+ if 'strides' in params :
409
+ stride_height , stride_width , stride_depth = params ['strides' ]
410
+ else :
411
+ stride_height , stride_width , stride_depth = params ['stride' ]
412
+ if 'pads' in params :
413
+ padding_h , padding_w , padding_d , _ , _ = params ['pads' ]
414
+ else :
415
+ padding_h , padding_w , padding_d = params ['padding' ]
416
+ input_name = inputs [0 ]
417
+ if padding_h > 0 and padding_w > 0 and padding_d > 0 :
418
+ padding_name = tf_name + '_pad'
419
+ padding_layer = keras .layers .ZeroPadding3D (
420
+ padding = (padding_h , padding_w , padding_d ),
421
+ name = padding_name
422
+ )
423
+ layers [padding_name ] = padding_layer (layers [inputs [0 ]])
424
+ input_name = padding_name
425
+
426
+ # Pooling type
427
+ pooling = keras .layers .MaxPooling3D (
428
+ pool_size = (height , width , depth ),
429
+ strides = (stride_height , stride_width , stride_depth ),
430
+ padding = 'valid' ,
431
+ name = tf_name
432
+ )
433
+
434
+ layers [scope_name ] = pooling (layers [input_name ])
435
+
436
+
336
437
def convert_dropout (params , w_name , scope_name , inputs , layers , weights , short_names ):
337
438
"""
338
439
Convert dropout.
@@ -979,6 +1080,7 @@ def target_layer(x):
979
1080
'onnx::Gemm' : convert_gemm ,
980
1081
'onnx::MaxPool' : convert_maxpool ,
981
1082
'max_pool2d' : convert_maxpool ,
1083
+ 'aten::max_pool3d' : convert_maxpool3 ,
982
1084
'onnx::AveragePool' : convert_avgpool ,
983
1085
'onnx::Dropout' : convert_dropout ,
984
1086
'onnx::BatchNormalization' : convert_batchnorm ,
0 commit comments