Skip to content
This repository was archived by the owner on Apr 18, 2023. It is now read-only.

Commit 51a8a3c

Browse files
committed
[Example] iterate specified layers
1 parent dc31ec2 commit 51a8a3c

File tree

4 files changed

+55
-27
lines changed

4 files changed

+55
-27
lines changed

examples/deeplab/utils.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ class Utils {
158158
}
159159

160160
// for debugging
161-
async iterateLayers(configs) {
161+
async iterateLayers(configs, layerList) {
162162
if (!this.initialized) return;
163163

164164
let iterators = [];
@@ -168,7 +168,7 @@ class Utils {
168168
backend: config.backend,
169169
prefer: config.prefer || null,
170170
});
171-
iterators.push(model.layerIterator([this.inputTensor]));
171+
iterators.push(model.layerIterator([this.inputTensor], layerList));
172172
}
173173

174174
while (true) {
@@ -178,23 +178,23 @@ class Utils {
178178
layerOutputs.push(await it.next());
179179
}
180180

181-
let baselineOutput = layerOutputs[0];
182-
if (baselineOutput.done) {
181+
let refOutput = layerOutputs[0];
182+
if (refOutput.done) {
183183
break;
184184
}
185185

186-
console.debug(`\n\n\nLayer ${baselineOutput.value.outputName}`);
186+
console.debug(`\n\n\nLayer(${refOutput.value.layerId}) ${refOutput.value.outputName}`);
187187

188188
for (let i = 0; i < configs.length; ++i) {
189189
console.debug(`\n${configs[i].backend}:`);
190190
console.debug(`\n${layerOutputs[i].value.tensor}`);
191191

192192
if (i > 0) {
193193
let sum = 0;
194-
for (let j = 0; j < baselineOutput.value.tensor.length; j++) {
195-
sum += Math.pow(layerOutputs[i].value.tensor[j] - baselineOutput.value.tensor[j], 2);
194+
for (let j = 0; j < refOutput.value.tensor.length; j++) {
195+
sum += Math.pow(layerOutputs[i].value.tensor[j] - refOutput.value.tensor[j], 2);
196196
}
197-
let variance = sum / baselineOutput.value.tensor.length;
197+
let variance = sum / refOutput.value.tensor.length;
198198
console.debug(`var with ${configs[0].backend}: ${variance}`);
199199
}
200200
}

examples/image_classification/utils.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ class Utils {
221221

222222

223223
// for debugging
224-
async iterateLayers(configs) {
224+
async iterateLayers(configs, layerList) {
225225
if (!this.initialized) return;
226226

227227
let iterators = [];
@@ -232,7 +232,7 @@ class Utils {
232232
backend: config.backend,
233233
prefer: config.prefer || null,
234234
});
235-
iterators.push(model.layerIterator([this.inputTensor]));
235+
iterators.push(model.layerIterator([this.inputTensor], layerList));
236236
}
237237

238238
while (true) {
@@ -242,23 +242,23 @@ class Utils {
242242
layerOutputs.push(await it.next());
243243
}
244244

245-
let baselineOutput = layerOutputs[0];
246-
if (baselineOutput.done) {
245+
let refOutput = layerOutputs[0];
246+
if (refOutput.done) {
247247
break;
248248
}
249249

250-
console.debug(`\n\n\nLayer ${baselineOutput.value.outputName}`);
250+
console.debug(`\n\n\nLayer(${refOutput.value.layerId}) ${refOutput.value.outputName}`);
251251

252252
for (let i = 0; i < configs.length; ++i) {
253253
console.debug(`\n${configs[i].backend}:`);
254254
console.debug(`\n${layerOutputs[i].value.tensor}`);
255255

256256
if (i > 0) {
257257
let sum = 0;
258-
for (let j = 0; j < baselineOutput.value.tensor.length; j++) {
259-
sum += Math.pow(layerOutputs[i].value.tensor[j] - baselineOutput.value.tensor[j], 2);
258+
for (let j = 0; j < refOutput.value.tensor.length; j++) {
259+
sum += Math.pow(layerOutputs[i].value.tensor[j] - refOutput.value.tensor[j], 2);
260260
}
261-
let variance = sum / baselineOutput.value.tensor.length;
261+
let variance = sum / refOutput.value.tensor.length;
262262
console.debug(`var with ${configs[0].backend}: ${variance}`);
263263
}
264264
}

examples/util/onnx/OnnxModelImporter.js

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,9 @@ class OnnxModelImporter {
5959
return 'success';
6060
}
6161

62-
async * layerIterator(inputTensors) {
62+
async * layerIterator(inputTensors, layerList) {
6363
const graph = this._rawModel.graph;
64-
const operatorsLength = graph.node.length;
65-
for (let lastNode = 0; lastNode < operatorsLength; ++lastNode) {
64+
const getLayerOutput = async (lastNode) => {
6665
this._tensorIds = [];
6766
this._tensorTypes = [];
6867
this._operations = [];
@@ -90,7 +89,23 @@ class OnnxModelImporter {
9089
const outputSize = this._getTensorTypeByName(outputName).dimensions.reduce((a, b) => a * b);
9190
const outputTensor = new Float32Array(outputSize);
9291
await this.compute(inputTensors, [outputTensor]);
93-
yield {outputName: outputName, tensor: outputTensor};
92+
return {layerId: lastNode, outputName: outputName, tensor: outputTensor};
93+
}
94+
95+
const operatorsLength = graph.node.length;
96+
if (typeof layerList === 'undefined') {
97+
for (let lastNode = 0; lastNode < operatorsLength;) {
98+
const layerOutput = await getLayerOutput(lastNode);
99+
yield layerOutput;
100+
lastNode = layerOutput.layerId + 1;
101+
}
102+
} else {
103+
for (let layerId of layerList) {
104+
if (layerId >= operatorsLength || layerId < 0) {
105+
throw new Error(`Illegal layer ${layerId}`);
106+
}
107+
yield await getLayerOutput(layerId);
108+
}
94109
}
95110
}
96111

examples/util/tflite/TFliteModelImporter.js

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,9 @@ class TFliteModelImporter {
133133
}, new Float32Array(tensor));
134134
}
135135

136-
async * layerIterator(inputTensors) {
136+
async * layerIterator(inputTensors, layerList) {
137137
const graph = this._rawModel.subgraphs(0);
138-
const operatorsLength = graph.operatorsLength();
139-
for (let lastNode = 0; lastNode < operatorsLength; ++lastNode) {
138+
const getLayerOutput = async (lastNode) => {
140139
this._tensorIds = [];
141140
this._operands = [];
142141
this._operandIndex = 0;
@@ -149,11 +148,9 @@ class TFliteModelImporter {
149148
lastNode = this._addOpsAndParams(lastNode);
150149

151150
const operator = graph.operators(lastNode);
152-
const opCode = this._rawModel.operatorCodes(operator.opcodeIndex()).builtinCode();
153-
const opcodeName = tflite.BuiltinOperator[opCode];
154-
155151
const inputs = Array.from(graph.inputsArray());
156152
const outputs = Array.from(operator.outputsArray());
153+
const outputName = graph.tensors(outputs[0]).name();
157154
this._model.identifyInputsAndOutputs(inputs, outputs);
158155

159156
await this._model.finish();
@@ -165,7 +162,23 @@ class TFliteModelImporter {
165162
const outputSize = graph.tensors(outputs[0]).shapeArray().reduce((a,b)=>a*b);
166163
const outputTensor = new Float32Array(outputSize);
167164
await this.compute(inputTensors, [outputTensor]);
168-
yield {outputName: opcodeName, tensor: outputTensor};
165+
return {layerId: lastNode, outputName: outputName, tensor: outputTensor};
166+
}
167+
168+
const operatorsLength = graph.operatorsLength();
169+
if (typeof layerList === 'undefined') {
170+
for (let lastNode = 0; lastNode < operatorsLength;) {
171+
const layerOutput = await getLayerOutput(lastNode);
172+
yield layerOutput;
173+
lastNode = layerOutput.layerId + 1;
174+
}
175+
} else {
176+
for (let layerId of layerList) {
177+
if (layerId >= operatorsLength || layerId < 0) {
178+
throw new Error(`Illegal layer ${layerId}`);
179+
}
180+
yield await getLayerOutput(layerId);
181+
}
169182
}
170183
}
171184

0 commit comments

Comments
 (0)