8 / 24 · Übung
Praktikum: Quantisierungsregeln ausführen
Quantisieren Sie −40 mit denselben uint8-Einstellungen. Welche Kodierung und welchen dequantisierten Wert erhalten Sie und welche Assertion würden Sie ergänzen?
Lektionen sind frei lesbar. Schreibe dich ein, um deinen Fortschritt zu speichern.
Ziel und Vorbereitung
Führen Sie Codeabbildung, negative Gleichstände, Sättigung und ein zentriertes Ganzzahlskalarprodukt aus. Diese Datei benötigt Node.js und kein externes Paket. Erstellen Sie quantize-lab.mjs in einem neuen leeren Ordner, kopieren Sie den folgenden Code und führen Sie node quantize-lab.mjs aus. Ohne Node füllen Sie die Vorhersagetabelle von Hand aus. Bietet Ihr installiertes Digital Design Studio einen unterstützten Ablauf zum Erstellen/Öffnen dieses Dateityps, können Sie dieselbe Datei dort manuell erstellen und untersuchen. Diese Anleitung behauptet keine automatische Projekterstellung oder Ausführung innerhalb von DDS.
Vor der Ausführung vorhersagen
Bei Skalierung 0.25 und Nullpunkt 128 wird −0.625 zum Gleichstand −2.5, auf gerades −2 gerundet und ergibt Code 126. Eingabe −0.375 ergibt ebenfalls 126. Null ergibt 128; 0.375 und 0.625 ergeben beide 130. Eingabe 40 würde 288 ergeben, daher ändert uint8-Sättigung sie auf 255. Sagen Sie [126,126,128,130,130,255] voraus. Diese Fälle unterscheiden negative und positive Gleichstände, reelle Null und Begrenzung.
Zentrieren Sie [130,126] zu [2,−2]. Mit Gewichten [3,−2] beträgt die Summe zehn. Kombinierte Skalierung 0.125 stellt reell 1.25 dar; Ausgabeskalierung 0.25 und Nullpunkt 128 ergeben 133. Der Code übt numerische Verhaltensregeln, ist kein Modellimporteur oder Genauigkeitsbenchmark.
Führen Sie zuerst die unveränderten Assertions aus. Ersetzen Sie anschließend 0.625 durch 0.875. Sagen Sie die Rundung des Gleichstands 3.5 auf vier und Code 132 voraus, bevor Sie den erwarteten Wert ändern. Ersetzen Sie vorübergehend roundEven durch Math.round, beobachten Sie das Fehlschlagen der Assertion für den negativen Gleichstand und stellen Sie die Routine wieder her. Ein absichtlicher Fehler zeigt, dass der Test das geforderte Verhalten beobachtet.
Dequantisieren Sie schließlich den gesättigten Code 255: Er stellt 31.75 dar, einen Fehler von −8.25 gegenüber 40. Dies übersteigt die übliche Rundungsgrenze einer halben Stufe deutlich. Die Wahl der Skalierung erfordert einen Kompromiss zwischen Bereich und Auflösung; die Messung der Modellgenauigkeit benötigt ein separates Modell und einen Datensatz. Erfassen Sie Vorhersagen, Befehlsausgabe und Begründung des veränderten Falls.
Ausführbare Datei
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}));Selbst ausprobieren
Quantisieren Sie −40 mit denselben uint8-Einstellungen. Welche Kodierung und welchen dequantisierten Wert erhalten Sie und welche Assertion würden Sie ergänzen?
Erklärung lesen
Der unbegrenzte Code ist −32, wird also auf Null begrenzt. Dequantisierung ergibt (0−128)×0.25=−32. Ergänzen Sie eine Assertion, dass quantize(−40,0.25,128) gleich Null ist, um negative Sättigung abzudecken.