7.4. Modell betöltése¶
A ml.Model beolvas egy modellfájlt a flash memóriából, elemzi azt, lefoglalja a hálózat által a következtetés során igényelt RAM-ot, és visszaad egy objektumot, amely a betöltött hálózatról minden olyan információt hordoz, amelyre a szkript további részének szüksége van.
7.4.1. A konstruktor¶
A konstruktor egy elérési utat és egy opcionális utófeldolgozót vesz át:
model = ml.Model("/rom/blazeface_front_128.tflite",
postprocess=BlazeFace())
A /rom/ (a flash memóriában rezidens fájlrendszer) helyen lévő modellek helyben kerülnek beolvasásra: a hálózat súlyai a flash memóriában maradnak, és a betöltött modell csak a tensor arena méretének megfelelő RAM-ot foglal. A /sdcard/ helyen lévő modellek betöltéskor a RAM-ba másolódnak, így a teljes költség a modellfájl mérete plusz a tensor arena. Mindkét elérési út működik; a kompromisszum a RAM.
Ha létezik egy azonos alapnevű, párhuzamos .txt fájl, annak tartalma automatikusan betöltődik a labels attribútumba. A postprocess= kulcsszó egy meghívható objektumot regisztrál, amelyet a predict() minden következtetés után lefuttat.
7.4.2. Csak olvasható tulajdonságok¶
A betöltött modell egy kis halmaz csak olvasható tulajdonságot tesz elérhetővé, amelyek leírják a hálózatot anélkül, hogy bárki futtatná azt.
Fájl és memória.
len– a lemezen tárolt modellfájl mérete, bájtban.ram– a tensor arena mérete, amelyre a hálózatnak a következtetés során a köztes aktivációihoz szüksége van, bájtban.
Bemeneti tenzorok.
input_shape– egy listányi tuple, bemeneti tenzoronként egy, amely megadja a hálózat által elvárt alakot. A látórendszeri hálózatoknak egy bemenetük van,(1, H, W, C)alakkal.input_dtype– egykarakteres dtype-kódok listája ('b'int8,'B'uint8,'h'int16,'H'uint16,'f'float32), bemenetenként egy.A
input_scaleés ainput_zero_point– a kvantálási paraméterek, amelyek átváltanak a hálózat tanításakor használt valós értékű bemenet és a kamera által futtatott egész számos reprezentáció között.
Kimeneti tenzorok. A bemeneti halmaz tükörképe: output_shape, output_dtype, output_scale, output_zero_point. Az észlelési hálózatok két vagy három kimeneti tenzort állítanak elő (dobozok, megbízhatósági pontszámok, néha osztályvalószínűségek); az osztályozási hálózatok egyet.
Extrák. A labels a párhuzamos .txt fájlból betöltött osztálynév-lista, vagy None. A postprocess a regisztrált utófeldolgozó, vagy None.
7.4.3. A BlazeFace vizsgálata¶
A szállított BlazeFace modell betöltése és az egyes tulajdonságok kiírása a tényleges számokat adja:
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)
A számok konkrétan azonosítják a hálózat interfészét: egyetlen (1, 128, 128, 3) int8 bemeneti tenzor és két int8 kimenet – az egyik a doboz-regressziós együtthatókhoz, a másik a horgonyonkénti megbízhatósági pontszámokhoz. A kvantálási paraméterek leírják, hogyan képeződnek le ezek az int8 értékek a valós float-okra, amelyekre a hálózatot tanították; az utófeldolgozó ezeket használja a kvantálás visszafejtéséhez a dobozok dekódolása előtt.
Minden tulajdonság az egyetlen igazságforrás arra nézve, amit leír. A szkriptek a input_shape olvasásával tudják meg, milyen formában rögzítsenek, a output_scale és a output_zero_point olvasásával dekódolják kézzel a tenzorokat, és a labels olvasásával jutnak az ember által olvasható osztálynevekhez – soha nem keményen bekódolva, soha nem feltételezve.