7.8. Tensor I/O

Engine menerima satu tensor pada sisi input dan menghasilkan satu atau lebih pada sisi output. Tensor-tensor tersebut adalah objek ndarray dengan bentuk, dtype, dan kosakata deskriptor yang diperkenalkan oleh bab numpy. Bentuk dan dtype-nya berasal dari file model dan dilaporkan melalui input_shape / output_shape dan input_dtype / output_dtype.

7.8.1. Kuantisasi

Sebagian besar jaringan yang dijalankan kamera beroperasi pada tensor integer yang dikuantisasi -- int8 atau uint8 -- agar sesuai dengan RAM dan anggaran komputasi kamera. Tensor yang dikuantisasi membawa nilai integer yang merepresentasikan bilangan bernilai nyata melalui skala per-tensor dan zero point:

\[\text{real} = \text{scale} \times (q - \text{zero_point})\]
\[q = \mathrm{round}(\text{real} / \text{scale}) + \text{zero_point}\]

Skala dan zero point berasal dari kalibrasi waktu pelatihan model dan disimpan dalam file model. Keduanya diekspos sebagai input_scale, input_zero_point, output_scale, dan output_zero_point -- masing-masing daftar dengan satu entri per tensor input atau output.

ml.utils.quantize() dan ml.utils.dequantize() menerapkan rumus terhadap indeks output yang ditentukan:

import ml.utils

real_tensor = ml.utils.dequantize(model, q_tensor, index=0)
q_tensor    = ml.utils.quantize(model, real_tensor, index=0)

Kedua fungsi mengembalikan nilai yang tidak berubah ketika dtype output pada indeks yang diberikan sudah float, sehingga pemanggilan aman terlepas dari status kuantisasi model.

7.8.2. Apa yang dilihat skrip pada sisi output

Apa yang dikembalikan predict() bergantung pada apakah post-processor terdaftar.

Tanpa post-processor, output integer mentah engine secara otomatis dide-kuantisasi ke float dan dikembalikan sebagai daftar objek float ndarray. Skrip menerima bilangan bernilai nyata yang siap dibaca. Ini adalah jalur yang tepat untuk jaringan klasifikasi, yang tensor output tunggalnya sudah berupa daftar skor kepercayaan per-kelas yang diiterasi aplikasi -- tidak diperlukan langkah decoding. Ini juga merupakan jalur mudah untuk menjalankan model yang tidak diketahui dengan cepat atau untuk inspeksi ad-hoc dari REPL.

Dengan post-processor yang terdaftar (melalui postprocess= pada konstruktor atau callback= pada panggilan predict), tensor integer yang dikuantisasi mentah diteruskan langsung ke callable post-processor. Post-processor menerima tensor yang dikuantisasi mentah dan bertanggung jawab atas de-kuantisasi apa pun yang dibutuhkannya.

Pemisahan ini adalah pilihan performa. Auto-de-kuantisasi mengalokasikan tensor float baru untuk setiap output dan menelusuri setiap elemen. Post-processor yang hanya membutuhkan beberapa nilai dari setiap tensor -- ambang batas skor kepercayaan, lalu dekode kotak untuk yang lolos -- melewati biaya de-kuantisasi sisanya. Decoder kotak yang dikirimkan di bawah ml.postprocessing semuanya mengambil rute ini, dan ml.utils.threshold() dibuat untuk kasus ini: ia mengambil tensor skor yang dikuantisasi dan mengembalikan indeks yang nilai de-kuantisasinya melewati ambang batas bernilai nyata, tanpa mende-kuantisasi seluruh tensor.