def common_backpropdata_extender(op: Node): for attr in ['strides', 'output_padding', 'pads_begin', 'pads_end', 'dilations']: Extender.attr_to_list(op, attr) if op.has_valid('output_padding'): op.output_padding = int64_array([0, 0] + op.output_padding) dim = len(op.strides) if op.has_valid('pads_begin') and op.has_valid('pads_end'): pad = [[0, 0], [0, 0]] pad.extend([[op.pads_begin[i], op.pads_end[i]] for i in range(dim)]) op['pad'] = int64_array(pad) op['spatial_dims'] = [i + 2 for i in range(dim)] if not op.has_valid('dilations'): op['dilations'] = [1 for _ in range(dim)] if not op.has_valid('strides'): op['strides'] = [1 for _ in range(dim)] op['dilation'] = int64_array([1, 1] + op.dilations) op['stride'] = int64_array([1, 1] + op.strides) op['infer'] = backpropdata_infer
def extend(op: Node): for attr in [ 'strides', 'dilations', 'pads_begin', 'pads_end', 'output_padding' ]: Extender.attr_to_list(op, attr) op['stride'] = int64_array([1, 1] + op.strides) op['dilation'] = int64_array([1, 1] + op.dilations) op['batch_dims'] = int64_array([0]) op['channel_dims'] = int64_array([1]) if op.has_valid('output_padding'): op.output_padding = int64_array([0, 0] + op.output_padding) # Be VERY careful with these attributes! op['input_feature_channel'] = 1 op['output_feature_channel'] = 0 dim = len(op.pads_begin) assert dim in (1, 2, 3), '{}D Convolution not supported!'.format(dim) pad = [[0, 0], [0, 0]] pad.extend([[op.pads_begin[i], op.pads_end[i]] for i in range(dim)]) op['pad'] = int64_array(pad) op['spatial_dims'] = [i + 2 for i in range(dim)]