in mmdnn/conversion/keras/keras2_parser.py [0:0]
def _convert_convolution(self, source_node, dim):
IR_node = self.IR_graph.node.add()
# input edge
self.convert_inedge(source_node, IR_node)
# name, op
if source_node.type.startswith('Separable'):
Keras2Parser._copy_and_reop(source_node, IR_node, "SeparableConv")
if self.weight_loaded:
self.set_weight(source_node.name, 'depthwise_filter', source_node.layer.get_weights()[0])
self.set_weight(source_node.name, 'pointwise_filter', source_node.layer.get_weights()[1])
else:
if source_node.type.startswith('Conv'):
if source_node.type.endswith('Transpose'):
Keras2Parser._copy_and_reop(source_node, IR_node, "ConvTranspose")
else:
Keras2Parser._copy_and_reop(source_node, IR_node, "Conv")
elif source_node.type.startswith('Deconv'):
Keras2Parser._copy_and_reop(source_node, IR_node, "ConvTranspose")
elif source_node.type.startswith('Depthwise'):
Keras2Parser._copy_and_reop(source_node, IR_node, "DepthwiseConv")
else:
raise NotImplementedError("Convolution layer [{}] is not supported.".format(source_node.type))
# weights
if self.weight_loaded:
self.set_weight(source_node.name, "weights", source_node.layer.get_weights()[0])
if source_node.layer.use_bias:
self.set_weight(source_node.name, "bias", source_node.layer.get_weights()[1])
if isinstance(source_node.layer.kernel_size, int):
source_node.layer.kernel_size = (source_node.layer.kernel_size) * dim
if isinstance(source_node.layer.strides, int):
source_node.layer.strides = (source_node.layer.strides) * dim
if isinstance(source_node.layer.dilation_rate, int):
source_node.layer.dilation_rate = (source_node.layer.dilation_rate) * dim
kwargs = dict()
# pads
Keras2Parser._convert_padding(source_node, IR_node)
# filter
# [kd, kh, kw, channel_size, filter number]
in_channel = source_node.layer.input_shape[-1] if self.data_format == "channels_last" else source_node.layer.input_shape[1]
out_channel = source_node.layer.filters or source_node.layer.depth_multiplier
if source_node.type.startswith("Deconv"):
kwargs['kernel_shape'] = list(source_node.layer.kernel_size) + [out_channel, in_channel]
else:
kwargs['kernel_shape'] = list(source_node.layer.kernel_size) + [in_channel, out_channel]
# use_bias
kwargs['use_bias'] = source_node.keras_layer.use_bias
# strides
# [1, sd, sh, sw, 1]
kwargs['strides'] = [1] + list(source_node.layer.strides) + [1]
# dilations
# [1, dd, dh, dw, 1]
kwargs['dilations'] = [1] + list(source_node.layer.dilation_rate) + [1]
assign_IRnode_values(IR_node, kwargs)
# activation
self._defuse_activation(source_node)