I was trying to compile keras model by following tvm tutorial code from_keras.py
shape_dict = {'input_1': (1, 3, 12, 12)}
p_mod, p_params = relay.frontend.from_keras(p_net, shape_dict)
The structure of network that I want to compile like this…
input_1
(None, None, None, 3)
conv2d_1
(None, None, None, 3)
p_re_lu_1
(None, None, None, 10)
max_pooling2d_1
(None, None, None, 10)
conv2d_2
(None, None, None, 10)
p_re_lu_2
(None, None, None, 16)
....
But error comes out…
Traceback (most recent call last):
File "mtcnn_vid_detection_tvm.py", line 43, in <module>
p_mod, p_params = relay.frontend.from_keras(p_net, shape_dict)
File "/home/tvm/python/tvm/relay/frontend/keras.py", line 864, in from_keras
keras_op_to_relay(inexpr, keras_layer, keras_layer.name + ':' + str(node_idx), etab)
File "/home/tvm/python/tvm/relay/frontend/keras.py", line 756, in keras_op_to_relay
outs = _convert_map[op_name](inexpr, keras_layer, etab)
File "/home/tvm/python/tvm/relay/frontend/keras.py", line 400, in _convert_pooling
pad_l, pad_r = _get_pad_pair(in_w, pool_w, stride_w)
File "/home/tvm/python/tvm/relay/frontend/keras.py", line 42, in _get_pad_pair
out1d = (input1d + stride1d - 1) // stride1d
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
Following that error,
I checked tvm/python/tvm/relay/frontend/keras.py and looked _convert_pooling function.
I found keras_layer.input_shape[1] and keras_layer.input_shape[2] is None, so in_h and in_w is also None.
I guess that’s the reason I cannot compile, but I don’t get any clue of this.
Is there I missing something? Thanks in advance for your help.
The code below is code of _convert_pooling
def _convert_pooling(inexpr, keras_layer, etab):
_check_data_format(keras_layer)
pool_type = type(keras_layer).__name__
# global pool in keras = global pool + flatten in relay
if pool_type == 'GlobalMaxPooling2D':
return _convert_flatten(_op.nn.global_max_pool2d(inexpr), keras_layer, etab)
if pool_type == 'GlobalAveragePooling2D':
return _convert_flatten(_op.nn.global_avg_pool2d(inexpr), keras_layer, etab)
print(keras_layer.pool_size)
pool_h, pool_w = keras_layer.pool_size
print(keras_layer.strides)
stride_h, stride_w = keras_layer.strides
params = {'pool_size': [pool_h, pool_w],
'strides': [stride_h, stride_w],
'padding': [0, 0]}
if keras_layer.padding == 'valid':
pass
elif keras_layer.padding == 'same':
in_h = keras_layer.input_shape[1]
in_w = keras_layer.input_shape[2]
# I guess this trigger error....
pad_t, pad_b = _get_pad_pair(in_h, pool_h, stride_h)
pad_l, pad_r = _get_pad_pair(in_w, pool_w, stride_w)
params['padding'] = [pad_t, pad_l, pad_b, pad_r]