7.4. Încărcarea unui model¶
ml.Model citește un fișier de model din memoria flash, îl analizează, alocă memoria RAM de care rețeaua are nevoie în timpul inferenței și returnează un obiect care conține tot ceea ce restul scriptului trebuie să știe despre rețeaua încărcată.
7.4.1. Constructorul¶
Constructorul primește o cale și un post-procesor opțional:
model = ml.Model("/rom/blazeface_front_128.tflite",
postprocess=BlazeFace())
Modelele de pe /rom/ (sistemul de fișiere rezident în flash) sunt citite pe loc: ponderile rețelei rămân în memoria flash, iar modelul încărcat consumă doar atâta RAM cât necesită arena de tensori. Modelele de pe /sdcard/ sunt copiate în RAM la momentul încărcării, astfel încât costul total este dimensiunea fișierului de model plus arena de tensori. Ambele căi funcționează; compromisul este memoria RAM.
Dacă există un fișier .txt cu același nume de bază, conținutul său este încărcat automat în labels. Cuvântul-cheie postprocess= înregistrează un obiect apelabil pe care predict() îl execută după fiecare inferență.
7.4.2. Proprietăți accesibile doar pentru citire¶
Un model încărcat expune un set restrâns de proprietăți accesibile doar pentru citire, care descriu rețeaua fără ca cineva să o execute.
Fișier și memorie.
len– dimensiunea pe disc a fișierului de model, în octeți.ram– dimensiunea arenei de tensori de care rețeaua are nevoie pentru activările sale intermediare în timpul inferenței, în octeți.
Tensori de intrare.
input_shape– o listă de tuple, câte una pentru fiecare tensor de intrare, care indică forma așteptată de rețea. Rețelele de viziune au o singură intrare cu forma(1, H, W, C).input_dtype– listă de coduri dtype de un singur caracter ('b'int8,'B'uint8,'h'int16,'H'uint16,'f'float32), câte unul pentru fiecare intrare.input_scaleșiinput_zero_point– parametrii de cuantizare care realizează conversia între intrarea cu valori reale pe care a fost antrenată rețeaua și reprezentarea întreagă cu care operează camera.
Tensori de ieșire. Oglindă a setului de intrare: output_shape, output_dtype, output_scale, output_zero_point. Rețelele de detectare produc doi sau trei tensori de ieșire (casete, scoruri de încredere, uneori probabilități de clasă); rețelele de clasificare produc unul singur.
Suplimente. labels este lista de nume de clase încărcată din fișierul .txt asociat, sau None. postprocess este post-procesorul înregistrat, sau None.
7.4.3. Inspectarea BlazeFace¶
Încărcarea modelului BlazeFace livrat din fabrică și afișarea fiecărei proprietăți oferă numerele reale:
import ml
from ml.postprocessing.mediapipe import BlazeFace
model = ml.Model("/rom/blazeface_front_128.tflite",
postprocess=BlazeFace())
print("file size: ", model.len, "bytes")
print("tensor arena: ", model.ram, "bytes")
print("input shape: ", model.input_shape)
print("input dtype: ", model.input_dtype)
print("input scale: ", model.input_scale)
print("input zp: ", model.input_zero_point)
print("output shape: ", model.output_shape)
print("output dtype: ", model.output_dtype)
print("output scale: ", model.output_scale)
print("output zp: ", model.output_zero_point)
Numerele identifică în mod concret interfața rețelei: un singur tensor de intrare (1, 128, 128, 3) de tip int8 și două ieșiri int8 – una pentru coeficienții de regresie a casetelor, una pentru scorurile de încredere per ancoră. Parametrii de cuantizare descriu modul în care aceste valori int8 se mapează la valorile reale float pe care a fost antrenată rețeaua; post-procesorul îi folosește pentru a anula cuantizarea înainte de decodarea casetelor.
Fiecare proprietate este sursa unică de adevăr pentru ceea ce descrie. Scripturile citesc input_shape pentru a ști la ce rezoluție să captureze, citesc output_scale și output_zero_point pentru a decoda tensorii manual și citesc labels pentru nume de clase lizibile – niciodată codate rigid, niciodată presupuse.