8 / 24 · 实验
实验:执行量化约定
使用相同的 uint8 设置量化 −40。编码和反量化值是多少?应添加哪项断言?
课时内容可免费阅读,选课后可保存学习进度。
目标与准备
执行编码映射、负半值、饱和和中心化整数点积。此文件需要 Node.js,不需要外部软件包。在新空文件夹中创建 quantize-lab.mjs,复制下面的代码,并运行 node quantize-lab.mjs。如果没有 Node,则手动完成预测表。如果已安装的 Digital Design Studio 为此文件类型提供受支持的创建/打开文件流程,也可以在那里手动创建并检查同一文件。这些说明不表示 DDS 内部具备自动创建项目或执行的能力。
运行前先预测
比例 0.25、零点 128 时,−0.625 变为半值 −2.5,舍入为偶数 −2,编码为 126。输入 −0.375 同样得到 126。零得到 128;0.375 和 0.625 都得到 130。输入 40 原本会得到 288,因此 uint8 饱和把它变成 255。预测结果为 [126,126,128,130,130,255]。这些用例分别检查负半值、正半值、真实零和截断。
将 [130,126] 中心化为 [2,−2]。权重为 [3,−2] 时,和为十。组合比例 0.125 表示真实值 1.25;输出比例 0.25、零点 128 时得到 133。这段代码是数值约定练习,不是模型导入器或准确率基准。
先运行未经修改的断言。然后将 0.625 替换为 0.875。在修改预期值之前,先预测半值 3.5 舍入为四、编码为 132。暂时将 roundEven 替换为 Math.round,观察负半值断言失败,再恢复原函数。有意制造失败可以证明测试确实观察到了所需行为。
最后,反量化饱和编码 255:它表示 31.75,相对于 40 的误差为 −8.25。这远大于普通舍入的半步长界限。选择比例因子涉及范围与分辨率的取舍;测量模型准确率需要单独的模型和数据集。记录预测、命令输出和修改用例的推理。
可运行文件
import assert from 'node:assert/strict';
// An exact tie is handled with nearest-even, including negative input.
export function roundEven(v) {
const f = Math.floor(v), d = v - f;
return d < 0.5 ? f : d > 0.5 ? f + 1 : f % 2 === 0 ? f : f + 1;
}
export const quantize = (x, s, z) => Math.min(255, Math.max(0, roundEven(x / s) + z));
const values = [-0.625, -0.375, 0, 0.375, 0.625, 40];
const codes = values.map(x => quantize(x, 0.25, 128));
assert.deepEqual(codes, [126, 126, 128, 130, 130, 255]);
assert.equal(roundEven(-1.5), -2);
assert.equal(roundEven(-2.5), -2);
const xq = [130, 126], wq = [3, -2];
const acc = xq.reduce((sum, x, i) => sum + (x - 128) * wq[i], 0);
assert.equal(acc, 10);
assert.equal(acc * 0.25 * 0.5, 1.25);
assert.equal(quantize(1.25, 0.25, 128), 133);
console.log(JSON.stringify({codes, acc, real: 1.25, output: 133}));自己试试
使用相同的 uint8 设置量化 −40。编码和反量化值是多少?应添加哪项断言?
阅读解释
未限制的编码为 −32,因此被截断为零。反量化为 (0−128)×0.25=−32。添加断言,检查 quantize(−40,0.25,128) 等于零,以覆盖负向饱和。