Merging Methods
Merge methods (layers) are use to merge 2 or more layer's output using the methods list below.
These methods are also layers which return a layer instance. However, they normally take two or more layer's output and "merge" them into one output. These layer instance must be passed to either model.merge(method, in1, in2)
or model.mergex(method, num_of_input, in1, in2, 1n3 ...)
. An example will be to concat the Inception structure.
Concat()
nnom_layer_t* Concat(int8_t axis);
Concatenate mutiple input on the selected axis.
Arguments
- axis: the axis number to concatenate in HWC format. The axis could be nagative, such as '-1' indicate the last one axis which is 'Channel'.
Return
- The concat layer instance
Notes
The concatenated axis can be different in all input layers passed to this method. Other axes must be same.
Mult()
nnom_layer_t* Mult(int32_t oshift);
Element wise mutiplication in all the inputs.
This layer cannot use to merge more than 2 layer, which might cause overflowing problem. 2 Mult()
must be used separately if willing to multiply 3 layer's output. The output shift individually of the 2 steps must be identify individually. Please check the example below for more than 2 input.
Arguments
- oshift: the output shift of this layer.
Return
- The mult layer instance
Notes
All input layers passed to this method must have same output shape.
Add()
nnom_layer_t* Add(int32_t oshift);
Element wise addition in all the inputs.
This layer cannot use to merge more than 2 layer, which might cause overflowing problem. Please refer to Mult()
Arguments
- oshift: the output shift of this layer.
Return
- The add layer instance
Notes
All input layers passed to this method must have same output shape.
Sub()
nnom_layer_t* Sub(int32_t oshift);
Element wise substraction in all the inputs.
This layer cannot use to merge more than 2 layer, which might cause overflowing problem. Please refer to Mult()
Arguments
- oshift: the output shift of this layer.
Return
- The sub layer instance
Notes
All input layers passed to this method must have same output shape.
Example
Channelwise concat for Inception
input_layer = Input(shape(INPUT_HIGHT, INPUT_WIDTH, INPUT_CH), nnom_input_data);
// conv2d - 1 - inception
x1 = model.hook(Conv2D(16, kernel(1, 5), stride(1, 1), PADDING_SAME, &c2_w, &c2_b), x);
x1 = model.hook(MaxPool(kernel(1, 2), stride(1, 2), PADDING_VALID), x1);
// conv2d - 2 - inception
x2 = model.hook(Conv2D(16, kernel(1, 3), stride(1, 1), PADDING_SAME, &c3_w, &c3_b), x);
x2 = model.hook(MaxPool(kernel(1, 2), stride(1, 2), PADDING_VALID), x2);
// maxpool - 3 - inception
x3 = model.hook(MaxPool(kernel(1, 2), stride(1, 2), PADDING_VALID), x);
// concatenate
x = model.mergex(Concat(-1), 3, x1, x2, x3);
// flatten
x = model.hook(Flatten(), x);
...
Mult for 3 input (or Add, Sub)
In Keras
#instead of
x = multiply([x1,x2,x3])
# you must use this instead to allow sript to calculate oshift individually.
x = multiply([x1,x2])
x = multiply([x,x3])
Then in NNoM
// x = x1 * x2 * x3
x = model.merge(Mult(oshift_1), x1, x2);
x = model.merge(Mult(oshift_2), x, x3);