in mmdnn/conversion/onnx/onnx_emitter.py [0:0]
def emit_Scale(self, IR_node):
dims = [i.size for i in IR_node.layer.attr['_output_shapes'].list.shape[0].dim[1:]]
units = dims[-1]
epsilon = 1e-5
if IR_node.get_attr('scale'):
self.add_body(1, "{:15} = _weights_dict['{}']['scale'].squeeze()".format(
IR_node.variable_name + '_scale_array',
IR_node.name))
else:
self.add_body(1, "{:15} = np.ndarray(_weights_dict['{}']['bias'].shape, dtype=_weights_dict['{}']['bias'].dtype).squeeze()".format(
IR_node.variable_name + '_scale_array',
IR_node.name,
IR_node.name))
self.add_body(1, "{:15}.fill(1)".format(IR_node.variable_name + '_scale_array'))
self.add_body(1, "{:15} = helper.make_tensor_value_info('{}', onnx.mapping.NP_TYPE_TO_TENSOR_TYPE[{}.dtype], list({}.shape))".format(
IR_node.variable_name + '_scale',
IR_node.variable_name + '_scale',
IR_node.variable_name + '_scale_array',
IR_node.variable_name + '_scale_array'))
self.add_body(1, "{:15} = helper.make_tensor(name='{}', data_type=onnx.mapping.NP_TYPE_TO_TENSOR_TYPE[{}.dtype], dims={}.shape, vals={})".format(
IR_node.variable_name + '_scale_init',
IR_node.variable_name + '_scale',
IR_node.variable_name + '_scale_array',
IR_node.variable_name + '_scale_array',
IR_node.variable_name + '_scale_array'))
self.add_body(1, "{:15} = _weights_dict['{}']['bias'].squeeze()".format(
IR_node.variable_name + '_bias_array',
IR_node.name))
self.add_body(1, "{:15} = helper.make_tensor_value_info('{}', onnx.mapping.NP_TYPE_TO_TENSOR_TYPE[{}.dtype], list({}.shape))".format(
IR_node.variable_name + '_bias',
IR_node.variable_name + '_bias',
IR_node.variable_name + '_bias_array',
IR_node.variable_name + '_bias_array'))
self.add_body(1, "{:15} = helper.make_tensor(name='{}', data_type=onnx.mapping.NP_TYPE_TO_TENSOR_TYPE[{}.dtype], dims={}.shape, vals={}.flatten().astype(float))".format(
IR_node.variable_name + '_bias_init',
IR_node.variable_name + '_bias',
IR_node.variable_name + '_bias_array',
IR_node.variable_name + '_bias_array',
IR_node.variable_name + '_bias_array'))
self.add_body(1, "{:15} = np.zeros({}, dtype=np.float32)".format(
IR_node.variable_name + '_mean_array',
units))
self.add_body(1, "{:15} = helper.make_tensor_value_info('{}', onnx.mapping.NP_TYPE_TO_TENSOR_TYPE[{}.dtype], list({}.shape))".format(
IR_node.variable_name + '_mean',
IR_node.variable_name + '_mean',
IR_node.variable_name + '_mean_array',
IR_node.variable_name + '_mean_array'))
self.add_body(1, "{:15} = helper.make_tensor(name='{}', data_type=onnx.mapping.NP_TYPE_TO_TENSOR_TYPE[{}.dtype], dims={}.shape, vals={}.flatten().astype(float))".format(
IR_node.variable_name + '_mean_init',
IR_node.variable_name + '_mean',
IR_node.variable_name + '_mean_array',
IR_node.variable_name + '_mean_array',
IR_node.variable_name + '_mean_array'))
self.add_body(1, "{:15} = np.ones({}, dtype=np.float32)".format(
IR_node.variable_name + '_var_array',
units))
self.add_body(1, "{:15} = helper.make_tensor_value_info('{}', onnx.mapping.NP_TYPE_TO_TENSOR_TYPE[{}.dtype], list({}.shape))".format(
IR_node.variable_name + '_var',
IR_node.variable_name + '_var',
IR_node.variable_name + '_var_array',
IR_node.variable_name + '_var_array'))
self.add_body(1, "{:15} = helper.make_tensor(name='{}', data_type=onnx.mapping.NP_TYPE_TO_TENSOR_TYPE[{}.dtype], dims={}.shape, vals={}.flatten().astype(float))".format(
IR_node.variable_name + '_var_init',
IR_node.variable_name + '_var',
IR_node.variable_name + '_var_array',
IR_node.variable_name + '_var_array',
IR_node.variable_name + '_var_array'))
self.add_body(1, "{:15} = helper.make_node('BatchNormalization', inputs=['{}', '{}', '{}', '{}', '{}'],outputs=['{}'], epsilon={}, is_test={}, name='{}')".format(
IR_node.variable_name,
self.parent_variable_name(IR_node),
IR_node.variable_name + '_scale',
IR_node.variable_name + '_bias',
IR_node.variable_name + '_mean',
IR_node.variable_name + '_var',
IR_node.variable_name,
epsilon,
0 if self.phase == 'train' else 1,
IR_node.variable_name))
self.inputs.append(IR_node.variable_name + '_scale')
self.inputs.append(IR_node.variable_name + '_bias')
self.inputs.append(IR_node.variable_name + '_mean')
self.inputs.append(IR_node.variable_name + '_var')
self.initializer.append(IR_node.variable_name + '_scale_init')
self.initializer.append(IR_node.variable_name + '_bias_init')
self.initializer.append(IR_node.variable_name + '_mean_init')
self.initializer.append(IR_node.variable_name + '_var_init')
self.nodes.append(IR_node.variable_name)