def _transform_extract_bias_add(g): # type:(NNEFGraph)->None supported_ops = {"conv", "deconv"} for nnefop in list(g.operations): if nnefop.name in supported_ops and len(nnefop.inputs) >= 3: bias = nnefop.inputs[2] nnefop.inputs = tuple(nnefop.inputs)[:2] if not (bias.is_constant and bias.data == [0]): output_with_bias = nnefop.output output_without_bias = NNEFTensor(graph=g, name=None, dtype=output_with_bias.dtype, shape=output_with_bias.shape) nnefop.outputs = output_without_bias NNEFOperation(graph=g, name="_bias_add", inputs=(output_without_bias, bias), outputs=output_with_bias)
def transform_extract_padding(g): # type:(NNEFGraph)->None forward_ops = { "conv", "argmax_pool", "max_pool_with_index", "max_pool", "avg_pool" } backward_ops = { "deconv", "conv_grad_filter", "max_pool_grad_with_index", "avg_pool_grad", "max_pool_grad" } supported_ops = forward_ops.union(backward_ops) for nnefop in list(g.operations): if nnefop.name in supported_ops: in_op_padding, separate_padding = get_paddings(nnefop) nnefop.attribs["padding"] = in_op_padding assert separate_padding is None if nnefop.name in backward_ops else True if separate_padding is not None: input = nnefop.inputs[0] pad_op = NNEFOperation( graph=g, name="box", inputs=input, attribs=dict(size=[1] * input.rank, border=nnefop.attribs["border"], padding=separate_padding), outputs=NNEFTensor( graph=g, name=None, shape=[ s + p + q for s, (p, q) in zip(input.shape, separate_padding) ], dtype=input.dtype)) nnefop.inputs = (pad_op.output, ) + tuple(nnefop.inputs)[1:]
def create_copy_op(self, graph, input, output): return NNEFOperation(graph=graph, name="copy", inputs=input, outputs=output)
def create_transpose_op(self, graph, input, output, axes): return NNEFOperation(graph=graph, name="transpose", inputs=input, attribs=dict(axes=axes), outputs=output)