|
|
@@ -183,7 +183,14 @@ darknet.Graph = class {
|
|
|
layer.out = layer.out_w * layer.out_h * layer.out_c;
|
|
|
layer.weights.push(load_weights(prefix + 'biases', [ n ], prefix === ''));
|
|
|
if (batch_normalize) {
|
|
|
- load_batch_normalize_weights(layer, prefix, n);
|
|
|
+ if (prefix) {
|
|
|
+ load_batch_normalize_weights(layer, prefix, n);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ const batchnorm_layer = { weights: [] };
|
|
|
+ load_batch_normalize_weights(batchnorm_layer, prefix, n);
|
|
|
+ layer.chain.push({ type: 'batchnorm', layer: batchnorm_layer });
|
|
|
+ }
|
|
|
}
|
|
|
layer.weights.push(load_weights(prefix + 'weights', [ Math.floor(c / groups), n, size, size ], prefix === ''));
|
|
|
layer.outputs[0].type = new darknet.TensorType('float32', make_shape([ layer.out_w, layer.out_h, layer.out_c ], 'make_convolutional_layer'));
|
|
|
@@ -196,7 +203,14 @@ darknet.Graph = class {
|
|
|
layer.out = outputs;
|
|
|
layer.weights.push(load_weights(prefix + 'biases', [ outputs ], prefix === ''));
|
|
|
if (batch_normalize) {
|
|
|
- load_batch_normalize_weights(layer, prefix, outputs);
|
|
|
+ if (prefix) {
|
|
|
+ load_batch_normalize_weights(layer, prefix, outputs);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ const batchnorm_layer = { weights: [] };
|
|
|
+ load_batch_normalize_weights(batchnorm_layer, prefix, outputs);
|
|
|
+ layer.chain.push({ type: 'batchnorm', layer: batchnorm_layer });
|
|
|
+ }
|
|
|
}
|
|
|
layer.weights.push(load_weights(prefix + 'weights', [ inputs, outputs ], prefix === ''));
|
|
|
layer.outputs[0].type = new darknet.TensorType('float32', make_shape([ outputs ], 'make_connected_layer'));
|
|
|
@@ -236,11 +250,11 @@ darknet.Graph = class {
|
|
|
for (let i = 0; i < sections.length; i++) {
|
|
|
const section = sections[i];
|
|
|
section.name = i.toString();
|
|
|
- section.chain = [];
|
|
|
section.layer = {
|
|
|
inputs: [],
|
|
|
weights: [],
|
|
|
- outputs: [ new darknet.Argument(section.name, null, null) ]
|
|
|
+ outputs: [ new darknet.Argument(section.name, null, null) ],
|
|
|
+ chain: []
|
|
|
};
|
|
|
}
|
|
|
|
|
|
@@ -326,7 +340,7 @@ darknet.Graph = class {
|
|
|
const activation = option_find_str(options, 'activation', 'logistic');
|
|
|
make_convolutional_layer(layer, '', params.w, params.h, params.c, n, groups, size, stride_x, stride_y, padding, batch_normalize);
|
|
|
if (activation !== 'logistic' && activation !== 'none') {
|
|
|
- section.chain.push({ type: activation });
|
|
|
+ layer.chain.push({ type: activation });
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
@@ -336,7 +350,7 @@ darknet.Graph = class {
|
|
|
const activation = option_find_str(options, 'activation', 'logistic');
|
|
|
make_connected_layer(layer, '', params.inputs, outputs, batch_normalize);
|
|
|
if (activation !== 'logistic' && activation !== 'none') {
|
|
|
- section.chain.push({ type: activation });
|
|
|
+ layer.chain.push({ type: activation });
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
@@ -358,7 +372,7 @@ darknet.Graph = class {
|
|
|
layer.weights.push(load_weights('biases',[ layer.out_w * layer.out_h * layer.out_c ]));
|
|
|
layer.outputs[0].type = new darknet.TensorType('float32', make_shape([ layer.out_w, layer.out_h, layer.out_c ], 'local'));
|
|
|
if (activation !== 'logistic' && activation !== 'none') {
|
|
|
- section.chain.push({ type: activation });
|
|
|
+ layer.chain.push({ type: activation });
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
@@ -408,7 +422,7 @@ darknet.Graph = class {
|
|
|
if (antialiasing) {
|
|
|
const blur_size = antialiasing === 2 ? 2 : 3;
|
|
|
const blur_pad = antialiasing === 2 ? 0 : Math.floor(blur_size / 3);
|
|
|
- layer.input_layer = { weights: [], outputs: layer.outputs };
|
|
|
+ layer.input_layer = { weights: [], outputs: layer.outputs, chain: [] };
|
|
|
make_convolutional_layer(layer.input_layer, '', layer.out_h, layer.out_w, layer.out_c, layer.out_c, layer.out_c, blur_size, blur_stride_x, blur_stride_y, blur_pad, 0);
|
|
|
layer.out_w = layer.input_layer.out_w;
|
|
|
layer.out_h = layer.input_layer.out_h;
|
|
|
@@ -441,11 +455,11 @@ darknet.Graph = class {
|
|
|
const pad = option_find_int(options, 'pad', 0);
|
|
|
const padding = pad ? (size >> 1) : option_find_int(options, 'padding', 0);
|
|
|
const batch_normalize = option_find_int(options, 'batch_normalize', 0);
|
|
|
- layer.input_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.input_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_convolutional_layer(layer.input_layer, 'input_', params.h, params.w, params.c, hidden_filters, groups, size, stride, stride, padding, batch_normalize);
|
|
|
- layer.self_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.self_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_convolutional_layer(layer.self_layer, 'self_', params.h, params.w, hidden_filters, hidden_filters, groups, size, stride, stride, padding, batch_normalize);
|
|
|
- layer.output_layer = { weights: [], outputs: layer.outputs };
|
|
|
+ layer.output_layer = { weights: [], outputs: layer.outputs, chain: [] };
|
|
|
make_convolutional_layer(layer.output_layer, 'output_', params.h, params.w, hidden_filters, output_filters, groups, size, stride, stride, padding, batch_normalize);
|
|
|
layer.weights = layer.weights.concat(layer.input_layer.weights);
|
|
|
layer.weights = layer.weights.concat(layer.self_layer.weights);
|
|
|
@@ -461,11 +475,11 @@ darknet.Graph = class {
|
|
|
const hidden = option_find_int(options, 'hidden', 1);
|
|
|
const batch_normalize = option_find_int(options, 'batch_normalize', 0);
|
|
|
const inputs = params.inputs;
|
|
|
- layer.input_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.input_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_connected_layer(layer.input_layer, 'input_', inputs, hidden, batch_normalize);
|
|
|
- layer.self_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.self_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_connected_layer(layer.self_layer, 'self_', hidden, hidden, batch_normalize);
|
|
|
- layer.output_layer = { weights: [], outputs: layer.outputs };
|
|
|
+ layer.output_layer = { weights: [], outputs: layer.outputs, chain: [] };
|
|
|
make_connected_layer(layer.output_layer, 'output_', hidden, outputs, batch_normalize);
|
|
|
layer.weights = layer.weights.concat(layer.input_layer.weights);
|
|
|
layer.weights = layer.weights.concat(layer.self_layer.weights);
|
|
|
@@ -480,17 +494,17 @@ darknet.Graph = class {
|
|
|
const inputs = params.inputs;
|
|
|
const outputs = option_find_int(options, 'output', 1);
|
|
|
const batch_normalize = option_find_int(options, 'batch_normalize', 0);
|
|
|
- layer.input_z_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.input_z_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_connected_layer(layer.input_z_layer, 'input_z', inputs, outputs, batch_normalize);
|
|
|
- layer.state_z_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.state_z_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_connected_layer(layer.state_z_layer, 'state_z', outputs, outputs, batch_normalize);
|
|
|
- layer.input_r_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.input_r_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_connected_layer(layer.input_r_layer, 'input_r', inputs, outputs, batch_normalize);
|
|
|
- layer.state_r_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.state_r_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_connected_layer(layer.state_r_layer, 'state_r', outputs, outputs, batch_normalize);
|
|
|
- layer.input_h_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.input_h_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_connected_layer(layer.input_h_layer, 'input_h', inputs, outputs, batch_normalize);
|
|
|
- layer.state_h_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.state_h_layer = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_connected_layer(layer.state_h_layer, 'state_h', outputs, outputs, batch_normalize);
|
|
|
layer.weights = layer.weights.concat(layer.input_z_layer.weights);
|
|
|
layer.weights = layer.weights.concat(layer.state_z_layer.weights);
|
|
|
@@ -506,21 +520,21 @@ darknet.Graph = class {
|
|
|
const inputs = params.inputs;
|
|
|
const outputs = option_find_int(options, 'output', 1);
|
|
|
const batch_normalize = option_find_int(options, 'batch_normalize', 0);
|
|
|
- layer.uf = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.uf = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_connected_layer(layer.uf, 'uf_', inputs, outputs, batch_normalize);
|
|
|
- layer.ui = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.ui = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_connected_layer(layer.ui, 'ui_', inputs, outputs, batch_normalize);
|
|
|
- layer.ug = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.ug = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_connected_layer(layer.ug, 'ug_', inputs, outputs, batch_normalize);
|
|
|
- layer.uo = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.uo = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_connected_layer(layer.uo, 'uo_', inputs, outputs, batch_normalize);
|
|
|
- layer.wf = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.wf = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_connected_layer(layer.wf, 'wf_', outputs, outputs, batch_normalize);
|
|
|
- layer.wi = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.wi = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_connected_layer(layer.wi, 'wi_', outputs, outputs, batch_normalize);
|
|
|
- layer.wg = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.wg = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_connected_layer(layer.wg, 'wg_', outputs, outputs, batch_normalize);
|
|
|
- layer.wo = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.wo = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_connected_layer(layer.wo, 'wo_', outputs, outputs, batch_normalize);
|
|
|
layer.weights = layer.weights.concat(layer.uf.weights);
|
|
|
layer.weights = layer.weights.concat(layer.ui.weights);
|
|
|
@@ -548,31 +562,31 @@ darknet.Graph = class {
|
|
|
const batch_normalize = option_find_int(options, 'batch_normalize', 0);
|
|
|
const bottleneck = option_find_int(options, "bottleneck", 0);
|
|
|
const peephole = option_find_int(options, "peephole", 0);
|
|
|
- layer.uf = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.uf = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_convolutional_layer(layer.uf, 'uf_', params.h, params.w, params.c, output_filters, groups, size, stride, stride, padding, batch_normalize);
|
|
|
- layer.ui = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.ui = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_convolutional_layer(layer.ui, 'ui_', params.h, params.w, params.c, output_filters, groups, size, stride, stride, padding, batch_normalize);
|
|
|
- layer.ug = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.ug = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_convolutional_layer(layer.ug, 'ug_', params.h, params.w, params.c, output_filters, groups, size, stride, stride, padding, batch_normalize);
|
|
|
- layer.uo = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.uo = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_convolutional_layer(layer.uo, 'uo_', params.h, params.w, params.c, output_filters, groups, size, stride, stride, padding, batch_normalize);
|
|
|
layer.weights = layer.weights.concat(layer.uf.weights);
|
|
|
layer.weights = layer.weights.concat(layer.ui.weights);
|
|
|
layer.weights = layer.weights.concat(layer.ug.weights);
|
|
|
layer.weights = layer.weights.concat(layer.uo.weights);
|
|
|
if (bottleneck) {
|
|
|
- layer.wf = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.wf = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_convolutional_layer(layer.wf, 'wf_', params.h, params.w, output_filters * 2, output_filters, groups, size, stride, stride, padding, batch_normalize);
|
|
|
layer.weights = layer.weights.concat(layer.wf.weights);
|
|
|
}
|
|
|
else {
|
|
|
- layer.wf = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.wf = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_convolutional_layer(layer.wf, 'wf_', params.h, params.w, output_filters, output_filters, groups, size, stride, stride, padding, batch_normalize);
|
|
|
- layer.wi = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.wi = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_convolutional_layer(layer.wi, 'wi_', params.h, params.w, output_filters, output_filters, groups, size, stride, stride, padding, batch_normalize);
|
|
|
- layer.wg = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.wg = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_convolutional_layer(layer.wg, 'wg_', params.h, params.w, output_filters, output_filters, groups, size, stride, stride, padding, batch_normalize);
|
|
|
- layer.wo = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.wo = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_convolutional_layer(layer.wo, 'wo_', params.h, params.w, output_filters, output_filters, groups, size, stride, stride, padding, batch_normalize);
|
|
|
layer.weights = layer.weights.concat(layer.wf.weights);
|
|
|
layer.weights = layer.weights.concat(layer.wi.weights);
|
|
|
@@ -580,11 +594,11 @@ darknet.Graph = class {
|
|
|
layer.weights = layer.weights.concat(layer.wo.weights);
|
|
|
}
|
|
|
if (peephole) {
|
|
|
- layer.vf = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.vf = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_convolutional_layer(layer.vf, 'vf_', params.h, params.w, output_filters, output_filters, groups, size, stride, stride, padding, batch_normalize);
|
|
|
- layer.vi = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.vi = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_convolutional_layer(layer.vi, 'vi_', params.h, params.w, output_filters, output_filters, groups, size, stride, stride, padding, batch_normalize);
|
|
|
- layer.vo = { weights: [], outputs: [ new darknet.Argument('', null, null) ] };
|
|
|
+ layer.vo = { weights: [], outputs: [ new darknet.Argument('', null, null) ], chain: [] };
|
|
|
make_convolutional_layer(layer.wo, 'vo_', params.h, params.w, output_filters, output_filters, groups, size, stride, stride, padding, batch_normalize);
|
|
|
layer.weights = layer.weights.concat(layer.vf.weights);
|
|
|
layer.weights = layer.weights.concat(layer.vi.weights);
|
|
|
@@ -744,7 +758,7 @@ darknet.Graph = class {
|
|
|
layer.outputs[0].type = new darknet.TensorType('float32', make_shape([ layer.out_w, layer.out_h, layer.out_c ], 'shortcut|scale_channels|sam'));
|
|
|
}
|
|
|
if (activation !== 'linear' && activation !== 'none') {
|
|
|
- section.chain.push({ type: activation });
|
|
|
+ layer.chain.push({ type: activation });
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
@@ -756,7 +770,7 @@ darknet.Graph = class {
|
|
|
layer.out = params.w * params.h * params.c;
|
|
|
layer.outputs[0].type = new darknet.TensorType('float32', make_shape([ params.w, params.h, params.c ], 'shortcut|scale_channels|sam'));
|
|
|
if (activation !== 'linear' && activation !== 'none') {
|
|
|
- section.chain.push({ type: activation });
|
|
|
+ layer.chain.push({ type: activation });
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
@@ -880,8 +894,8 @@ darknet.Node = class {
|
|
|
if (layer && layer.outputs && layer.outputs.length > 0) {
|
|
|
this._outputs.push(new darknet.Parameter(layer.outputs.length <= 1 ? 'output' : 'outputs', true, layer.outputs));
|
|
|
}
|
|
|
- if (section.chain) {
|
|
|
- for (const chain of section.chain) {
|
|
|
+ if (layer && layer.chain) {
|
|
|
+ for (const chain of layer.chain) {
|
|
|
this._chain.push(new darknet.Node(metadata, net, chain, ''));
|
|
|
}
|
|
|
}
|