Altifigence Academy

8 / 24 · Praktikum

Praktikum: jalankan kontrak kuantisasi

Kuantisasikan −40 dengan pengaturan uint8 yang sama. Berapa kode dan nilai dekuantisasinya, serta assertion mana yang akan Anda tambahkan?

Tujuan dan persiapan

Jalankan pemetaan kode, nilai tengah negatif, saturasi, dan hasil kali titik bilangan bulat yang dipusatkan. Berkas ini membutuhkan Node.js tanpa paket eksternal. Buat quantize-lab.mjs dalam folder kosong baru, salin kode di bawah, lalu jalankan node quantize-lab.mjs. Tanpa Node, lengkapi tabel prediksi secara manual. Jika Digital Design Studio terpasang Anda menyediakan alur pembuatan/pembukaan berkas yang didukung untuk tipe ini, Anda dapat membuat dan memeriksa berkas yang sama secara manual di sana. Instruksi ini tidak mengklaim pembuatan proyek otomatis atau eksekusi di dalam DDS.

Prediksi sebelum menjalankan

Pada skala 0.25 dan titik nol 128, −0.625 menjadi nilai tengah −2.5, dibulatkan ke −2 genap, dan memberi kode 126. Masukan −0.375 juga memberi 126. Nol memberi 128; 0.375 dan 0.625 sama-sama memberi 130. Masukan 40 akan memberi 288, sehingga saturasi uint8 mengubahnya menjadi 255. Prediksikan [126,126,128,130,130,255]. Kasus ini membedakan nilai tengah negatif, nilai tengah positif, nol riil, dan pemotongan.

Pusatkan [130,126] menjadi [2,−2]. Dengan bobot [3,−2], jumlahnya sepuluh. Skala gabungan 0.125 mewakili nilai riil 1.25; skala keluaran 0.25 dan titik nol 128 memberi 133. Kode ini merupakan latihan kontrak numerik, bukan pengimpor model atau tolok ukur akurasi.

Pertama jalankan assertion tanpa perubahan. Lalu ganti 0.625 dengan 0.875. Prediksikan nilai tengah 3.5 yang dibulatkan ke empat dan kode 132 sebelum mengubah nilai harapan. Ganti sementara roundEven dengan Math.round dan amati assertion nilai tengah negatif gagal, lalu pulihkan. Kegagalan sengaja menunjukkan bahwa pengujian mengamati perilaku yang diwajibkan.

Terakhir, dekuantisasikan kode tersaturasi 255: kode itu mewakili 31.75, kesalahan −8.25 terhadap 40. Ini jauh lebih besar daripada batas pembulatan setengah langkah biasa. Pemilihan skala melibatkan kompromi rentang dan resolusi; pengukuran akurasi model memerlukan model dan dataset terpisah. Catat prediksi, keluaran perintah, dan penalaran kasus yang diubah.

Berkas yang dapat dijalankan

javascript
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}));

Coba sendiri

Kuantisasikan −40 dengan pengaturan uint8 yang sama. Berapa kode dan nilai dekuantisasinya, serta assertion mana yang akan Anda tambahkan?

Baca penjelasan

Kode tanpa batasnya −32, sehingga dipotong menjadi nol. Dekuantisasi adalah (0−128)×0.25=−32. Tambahkan assertion bahwa quantize(−40,0.25,128) sama dengan nol untuk mencakup saturasi negatif.

Lesson files

quantize-lab.mjs ↓

Pilihan berlaku di peramban ini. Ubah kapan saja di bagian bawah halaman.