8 / 24 · Esercitazione
Laboratorio: esegui il contratto di quantizzazione
Quantizza −40 con le stesse impostazioni uint8. Quali sono il suo codice e il valore dequantizzato e quale asserzione aggiungeresti?
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
Obiettivo e preparazione
Esegui associazione dei codici, equidistanze negative, saturazione e un prodotto scalare intero centrato. Questo file richiede Node.js e nessun pacchetto esterno. Crea quantize-lab.mjs in una nuova cartella vuota, copia il codice seguente ed esegui node quantize-lab.mjs. Senza Node, completa a mano la tabella delle previsioni. Se il tuo Digital Design Studio installato offre un flusso supportato di creazione/apertura per questo tipo di file, puoi creare e ispezionare manualmente lo stesso file lì. Queste istruzioni non attestano creazione automatica del progetto o esecuzione dentro DDS.
Prevedi prima di eseguire
Con scala 0.25 e punto zero 128, −0.625 diventa il caso equidistante −2.5, si arrotonda al pari −2 e dà codice 126. Anche l'ingresso −0.375 dà 126. Zero dà 128; 0.375 e 0.625 danno entrambi 130. L'ingresso 40 darebbe 288, quindi la saturazione uint8 lo cambia a 255. Prevedi [126,126,128,130,130,255]. Questi casi distinguono equidistanze negative, positive, zero reale e limitazione.
Centra [130,126] a [2,−2]. Con pesi [3,−2], la somma è dieci. La scala combinata 0.125 rappresenta il reale 1.25; scala di uscita 0.25 e punto zero 128 danno 133. Il codice è un esercizio sul contratto numerico, anziché un importatore di modelli o un benchmark di accuratezza.
Esegui prima le asserzioni invariate. Poi sostituisci 0.625 con 0.875. Prevedi l'equidistanza 3.5 arrotondata a quattro e codice 132 prima di cambiare il valore atteso. Sostituisci temporaneamente roundEven con Math.round e osserva fallire l'asserzione sull'equidistanza negativa, poi ripristinalo. Un fallimento intenzionale dimostra che il test osserva il comportamento richiesto.
Infine, dequantizza il codice saturato 255: rappresenta 31.75, un errore di −8.25 rispetto a 40. È molto maggiore del normale limite di arrotondamento di mezzo passo. Scegliere la scala implica un compromesso tra intervallo e risoluzione; misurare l'accuratezza del modello richiede un modello e un dataset separati. Registra previsioni, uscita del comando e ragionamento sul caso modificato.
File eseguibile
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}));Prova tu
Quantizza −40 con le stesse impostazioni uint8. Quali sono il suo codice e il valore dequantizzato e quale asserzione aggiungeresti?
Leggi la spiegazione
Il codice non limitato è −32, quindi viene limitato a zero. La dequantizzazione è (0−128)×0.25=−32. Aggiungi un'asserzione che quantize(−40,0.25,128) sia uguale a zero per coprire la saturazione negativa.