瀏覽代碼

Add TensorFlow Lite test file (#34) (#891)

Lutz Roeder 4 年之前
父節點
當前提交
169b2900e4
共有 6 個文件被更改,包括 35 次插入18 次删除
  1. 18 13
      source/circle.js
  2. 5 3
      source/mslite.js
  3. 1 1
      source/tflite.js
  4. 2 1
      source/view-sidebar.js
  5. 2 0
      test/models.js
  6. 7 0
      test/models.json

+ 18 - 13
source/circle.js

@@ -474,20 +474,25 @@ circle.Argument = class {
         this._initializer = initializer;
         const quantization = tensor.quantization;
         if (quantization) {
-            let value = 'q';
-            const scale = (quantization.scale.length == 1) ? quantization.scale[0] : 0;
-            const zeroPoint = ((quantization.zero_point.length == 1) ? quantization.zero_point[0] : 0).toString();
-            if (scale !== 0 || zeroPoint !== '0') {
-                value = scale.toString() + ' * ' + (zeroPoint === '0' ? 'q' : ('(q' + (!zeroPoint.startsWith('-') ? ' - ' + zeroPoint : ' + ' + zeroPoint.substring(1)) + ')'));
-            }
-            if (quantization.min.length == 1) {
-                value = quantization.min[0].toString() + ' \u2264 ' + value;
-            }
-            if (quantization.max.length == 1) {
-                value = value + ' \u2264 ' + quantization.max[0].toString();
+            const length = Math.max(quantization.scale.length, quantization.zero_point.length, quantization.min.length, quantization.max.length);
+            const list = [];
+            for (let i = 0; i < length; i++) {
+                let value = 'q';
+                const scale = i < quantization.scale.length ? quantization.scale[i] : 0;
+                const zeroPoint = (i < quantization.zero_point.length ? quantization.zero_point[i] : 0).toString();
+                if (scale !== 0 || zeroPoint !== '0') {
+                    value = scale.toString() + ' * ' + (zeroPoint === '0' ? 'q' : ('(q' + (!zeroPoint.startsWith('-') ? ' - ' + zeroPoint : ' + ' + zeroPoint.substring(1)) + ')'));
+                }
+                if (i < quantization.min.length) {
+                    value = quantization.min[i].toString() + ' \u2264 ' + value;
+                }
+                if (i < quantization.max.length) {
+                    value = value + ' \u2264 ' + quantization.max[i].toString();
+                }
+                list.push(value);
             }
-            if (value != 'q') {
-                this._quantization = value;
+            if (list.length > 0 && !list.every((value) => value === 'q')) {
+                this._quantization = list;
             }
         }
     }

+ 5 - 3
source/mslite.js

@@ -274,14 +274,16 @@ mslite.Argument = class {
         this._initializer = initializer || null;
 
         if (tensor.quantParams) {
-            const params = [];
+            const list = [];
             for (let i = 0; i < tensor.quantParams.length; i++) {
                 const param = tensor.quantParams[i];
                 if (param.scale !== 0 || param.zeroPoint !== 0) {
-                    params.push(param.scale.toString() + ' * x + ' + param.zeroPoint.toString());
+                    list.push((param.scale !== 1 ? param.scale.toString() + ' * ' : '') + 'q' + (param.zeroPoint !== 0 ? ' + ' + param.zeroPoint.toString() : ''));
                 }
             }
-            this._quantization = params.join(' -> ');
+            if (list.length > 0 && !list.every((value) => value === 'q')) {
+                this._quantization = list.length === 1 ? list[0] : list;
+            }
         }
     }
 

+ 1 - 1
source/tflite.js

@@ -505,7 +505,7 @@ tflite.Argument = class {
                 list.push(value);
             }
             if (list.length > 0 && !list.every((value) => value === 'q')) {
-                this._quantization = list.length === 1 ? list[0] : '\n\n' + list.map((value) => '  ' + value).join('\n');
+                this._quantization = list.length === 1 ? list[0] : list;
             }
         }
     }

+ 2 - 1
source/view-sidebar.js

@@ -747,7 +747,8 @@ sidebar.ArgumentView = class {
                 if (quantization) {
                     const quantizationLine = this._host.document.createElement('div');
                     quantizationLine.className = 'sidebar-view-item-value-line-border';
-                    quantizationLine.innerHTML = '<span class=\'sidebar-view-item-value-line-content\'>quantization: ' + '<b>' + quantization.replace(/(?:\n)/g, '<br>') + '</b></span>';
+                    const content = !Array.isArray(quantization) ? quantization : '<br><br>' + quantization.map((value) => '  ' + value).join('<br>');
+                    quantizationLine.innerHTML = '<span class=\'sidebar-view-item-value-line-content\'>quantization: ' + '<b>' + content + '</b></span>';
                     this._element.appendChild(quantizationLine);
                 }
 

+ 2 - 0
test/models.js

@@ -620,6 +620,8 @@ const loadModel = (target, item) => {
                     if (argument.type) {
                         argument.type.toString();
                     }
+                    argument.quantization;
+                    argument.initializer;
                 }
             }
             for (const output of graph.outputs) {

+ 7 - 0
test/models.json

@@ -5993,6 +5993,13 @@
     "format":   "TensorFlow Lite v3",
     "link":     "https://github.com/lutzroeder/netron/issues/499"
   },
+  {
+    "type":     "tflite",
+    "target":   "efficientnet_lite1_int8_2.tflite",
+    "source":   "https://github.com/lutzroeder/netron/files/8309257/efficientnet_lite1_int8_2.tflite.zip[efficientnet_lite1_int8_2.tflite]",
+    "format":   "TensorFlow Lite v3",
+    "link":     "https://github.com/lutzroeder/netron/issues/34"
+  },
   {
     "type":     "tflite",
     "target":   "face_detection_front.json",