in mmdnn/conversion/keras/keras2_emitter.py [0:0]
def emit_Pool(self, IR_node, in_scope=False):
codes = list()
dim = len(IR_node.get_attr("strides")) - 2
pooling_type = IR_node.get_attr('pooling_type')
if pooling_type == "MAX":
pool_name = "MaxPooling{}D".format(dim)
elif pooling_type == "AVG":
pool_name = "AveragePooling{}D".format(dim)
else:
print(pooling_type)
assert False
# TODO
if IR_node.layer.attr['global_pooling'].b:
shape_str = IR_node.get_attr("shape_coreml")
if shape_str:
shape_str = ','.join([str(i) for i in shape_str])
codes.append("{:<15} = layers.Global{}(name = '{}')({})".format(
IR_node.variable_name+'before',
pool_name,
IR_node.name,
self.parent_variable_name(IR_node)))
# when converting from coreml model, reshape is needed after the global pooling
codes.append("{:<15} = layers.Reshape(name = '{}', target_shape = ({},))({})".format(
IR_node.variable_name,
IR_node.name + 'reshape',
shape_str,
IR_node.variable_name+'before'))
else:
codes.append("{:<15} = layers.Global{}(name = '{}')({})".format(
IR_node.variable_name,
pool_name,
IR_node.name,
self.parent_variable_name(IR_node)))
else:
dilations = IR_node.get_attr('dilations')
if dilations:
for e in IR_node.get_attr('dilations'):
assert e == 1
pool_size = IR_node.get_attr('kernel_shape')[1:-1]
strides = IR_node.get_attr('strides')[1:-1]
padding = IR_node.get_attr('pads')[1:dim]
if pooling_type == "AVG" and pool_size.count(pool_size[0]) == len(pool_size) and strides[0] == 1 and strides.count(strides[0]) == len(strides) and padding.count(padding[0]) == len(padding) and pool_size[0] == padding[0]*2 + 1:
pool_size = ', '.join('%s' % i for i in pool_size)
strides = ', '.join('%s' % i for i in strides)
codes.append("{:<15} = layers.{}(name = '{}', pool_size = ({}), strides = ({}), padding = '{}')({})".format(
IR_node.variable_name,
pool_name,
IR_node.name,
pool_size,
strides,
'same',
self.parent_variable_name(IR_node)
))
else:
pool_size = ', '.join('%s' % i for i in pool_size)
strides = ', '.join('%s' % i for i in strides)
input_node, padding = self._defuse_padding(IR_node)
codes.append("{:<15} = layers.{}(name = '{}', pool_size = ({}), strides = ({}), padding = '{}')({})".format(
IR_node.variable_name,
pool_name,
IR_node.name,
pool_size,
strides,
padding,
input_node))
return codes