7.8. Tenzorski U/I

Mehanizam prima jedan tenzor na ulaznoj strani i proizvodi jedan ili više na izlaznoj strani. Tenzori su ndarray objekti s oblikom, dtypeom i vokabularom deskriptora koje je uvelo poglavlje o numpy. Njihovi oblici i dtypeovi dolaze iz datoteke modela i prijavljuju se kroz input_shape / output_shape i input_dtype / output_dtype.

7.8.1. Kvantizacija

Većina mreža koje kamera pokreće radi na kvantiziranim cjelobrojnim tenzorima – int8 ili uint8 – kako bi stale unutar RAM-a kamere i proračuna za izračun. Kvantizirani tenzor nosi cjelobrojne vrijednosti koje predstavljaju brojeve realne vrijednosti kroz skalu po tenzoru i nultu točku:

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

Skala i nulta točka dolaze iz kalibracije iz vremena treniranja modela i pohranjene su u datoteci modela. Izložene su kao input_scale, input_zero_point, output_scale i output_zero_point – svaka popis s jednim unosom po ulaznom ili izlaznom tenzoru.

ml.utils.quantize() i ml.utils.dequantize() primjenjuju formule nad navedenim izlaznim indeksom:

import ml.utils

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

Obje funkcije vraćaju vrijednost nepromijenjenu kada je izlazni dtype na danom indeksu već float, pa je poziv siguran bez obzira na status kvantizacije modela.

7.8.2. Što skripta vidi na izlaznoj strani

Što predict() vraća ovisi o tome je li registriran post-procesor.

Bez post-procesora, sirovi cjelobrojni izlazi mehanizma automatski se dekvantiziraju u float i vraćaju kao popis float ndarray objekata. Skripta prima brojeve realne vrijednosti spremne za čitanje. Ovo je ispravna putanja za mreže za klasifikaciju, čiji je jedan izlazni tenzor već popis ocjena pouzdanosti po klasi kroz koji aplikacija iterira – nije potreban korak dekodiranja. Također je laka putanja za brzo pokretanje nepoznatog modela ili za ad-hoc pregled iz REPL-a.

S registriranim post-procesorom (kroz postprocess= u konstruktoru ili callback= u predict pozivu), sirovi kvantizirani tenzori predaju se izravno pozivnoj funkciji post-procesora. Post-procesor prima sirove kvantizirane tenzore i odgovoran je za kakvu god dekvantizaciju mu je potrebna.

Podjela je izbor performansi. Automatska dekvantizacija dodjeljuje novi float tenzor za svaki izlaz i prolazi kroz svaki element. Post-procesor kojemu je potrebno samo nekoliko vrijednosti iz svakog tenzora – pragom filtrira ocjene pouzdanosti, a zatim dekodira okvire za preživjele – preskače trošak dekvantizacije ostatka. Dekoderi okvira isporučeni pod ml.postprocessing svi idu ovim putem, a ml.utils.threshold() napravljen je upravo za ovaj slučaj: prima kvantizirani tenzor ocjena i vraća indekse čije dekvantizirane vrijednosti prolaze prag realne vrijednosti, bez dekvantizacije cijelog tenzora.