This block has no effect on the result at all, even though I set the values to zero:
int i;
for(i = 0; i < net.n ; i){
layer l = net.layers[i];
if(l.type == CONVOLUTIONAL){
//save_convolutional_weights(l, fp);
l.weights_quant_multipler = 0;
}
}
On the other hand, the values are set to zero, which dramatically changes the result:
int i;
for (i = 0; i < net.n; i) {
layer *l = &net.layers[i];
if (l->type == CONVOLUTIONAL) {
l->weights_quant_multipler = 0;
}
}
What causes the difference? Thanks for your help.
CodePudding user response:
The first code block make a copy of net.layers[i] and changes that. The second changes the original net.layers[i] through a pointer.
CodePudding user response:
In the first case, l is a different instance of layer than net.layers[i] - any changes made to l do not affect net.layers[i] (any more than changes to net.layers[i 1] affect net.layers[i].
In the second case, l is a pointer to net.layers[i] - instead of being a separate instance of layer, it's a reference to net.layers[i]).
Writing l->weights_quant_multiplier = 0 is exactly equivalent to writing net.layers[i].weight_quant_multiplier = 0.
l == &net.layers[i] // layer * == layer *
*l == net.layers[i] // layer == layer
