diff --git a/source/view.js b/source/view.js index 59a13c1071..46b691b804 100644 --- a/source/view.js +++ b/source/view.js @@ -2686,6 +2686,9 @@ view.ValueTextView = class extends view.Control { line.innerText = item; line.style.whiteSpace = style; break; + case 'percentage': + line.innerText = `${(item * 100).toFixed(1)}%`; + break; default: line.innerText = item; break; @@ -3162,7 +3165,16 @@ view.TensorSidebar = class extends view.ObjectSidebar { if (value.type) { const item = new view.ValueView(this._view, value, ''); this.add('type', item); - item.toggle(); + } + + if (value.initializer && value.initializer.category === 'Initializer') { + this.addHeader('Metrics'); + + const tensor = new view.Tensor(value.initializer); + const metrics = tensor.metrics; + for (const metric of metrics) { + this.addProperty(metric.name, [metric.value], metric.style); + } } } }; @@ -3623,10 +3635,11 @@ view.FindSidebar = class extends view.Control { view.Argument = class { - constructor(name, value, type) { + constructor(name, value, type, style) { this.name = name; this.value = value; this.type = type; + this.style = style; } }; @@ -3638,6 +3651,7 @@ view.Tensor = class { this._encoding = tensor.encoding; this._layout = tensor.type.layout; this._stride = tensor.stride; + this._metrics = null; switch (this._encoding) { case undefined: case '': @@ -4119,12 +4133,38 @@ view.Tensor = class { } get metrics() { - const metrics = Array.from(this._tensor.metrics || []); - const keys = new Set(metrics.map((metrics) => metrics.name)); - if (!keys.has('sparisity')) { - // metrics.push(new view.Argument('sparisity', 0, 'float32')); + if (this._metrics === null) { + const value = this.value; + + const metrics = Array.from(this._tensor.metrics || []); + const keys = new Set(metrics.map((metrics) => metrics.name)); + if (!keys.has('sparsity')) { + let num_zeros = 0; + let num_parameters = 0; + const stack = [value]; + while (stack.length > 0) { + const val = stack.pop(); + if (Array.isArray(val)) { + for (const element of val) { + stack.push(element); + } + } else { + num_zeros += Number(val === 0); + num_parameters += 1; + } + } + + if (num_parameters > 0) { + metrics.push(new view.Argument('sparsity', num_zeros / num_parameters, 'float32', 'percentage')); + } else { + metrics.push(new view.Argument('sparsity', 0, 'float32', 'percentage')); + } + } + + this._metrics = metrics; } - return metrics; + + return this._metrics; } };