7.4. Ladda en modell¶
ml.Model läser en modellfil från flashminnet, tolkar den, allokerar det RAM som nätverket behöver under inferens, och returnerar ett objekt som bär med sig allt som resten av skriptet behöver veta om det laddade nätverket.
7.4.1. Konstruktorn¶
Konstruktorn tar en sökväg och en valfri efterbehandlare:
model = ml.Model("/rom/blazeface_front_128.tflite",
postprocess=BlazeFace())
Modeller på /rom/ (det flashbaserade filsystemet) läses på plats: nätverkets vikter ligger kvar i flashminnet och den laddade modellen förbrukar bara det RAM som tensorarenan kräver. Modeller på /sdcard/ kopieras in i RAM vid laddningstillfället, så den totala kostnaden är modellfilens storlek plus tensorarenan. Båda sökvägarna fungerar; avvägningen handlar om RAM.
Om det finns en intilliggande .txt-fil med samma basnamn laddas dess innehåll automatiskt in i labels. Nyckelordet postprocess= registrerar ett anropbart objekt som predict() kör efter varje inferens.
7.4.2. Skrivskyddade egenskaper¶
En laddad modell exponerar en liten uppsättning skrivskyddade egenskaper som beskriver nätverket utan att någon kör det.
Fil och minne.
len– modellfilens storlek på disk, i byte.ram– storleken på den tensorarena som nätverket behöver för sina mellanliggande aktiveringar under inferens, i byte.
Indatatensorer.
input_shape– en lista med tupler, en per indatatensor, som anger den form nätverket förväntar sig. Visionsnätverk har en indata med formen(1, H, W, C).input_dtype– lista med dtype-koder på ett tecken ('b'int8,'B'uint8,'h'int16,'H'uint16,'f'float32), en per indata.input_scaleochinput_zero_point– de kvantiseringsparametrar som omvandlar mellan den reellvärda indata som nätverket tränades på och den heltalsrepresentation som kameran kör mot.
Utdatatensorer. Spegelbild av indatauppsättningen: output_shape, output_dtype, output_scale, output_zero_point. Detekteringsnätverk producerar två eller tre utdatatensorer (rutor, konfidenspoäng, ibland klassannolikheter); klassificeringsnätverk producerar en.
Extra. labels är listan med klassnamn som laddats från den intilliggande .txt-filen, eller None. postprocess är den registrerade efterbehandlaren, eller None.
7.4.3. Granska BlazeFace¶
Att ladda den medföljande BlazeFace-modellen och skriva ut varje egenskap ger de faktiska siffrorna:
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)
Siffrorna identifierar nätverkets gränssnitt konkret: en enda (1, 128, 128, 3) int8-indatatensor och två int8-utdata – en för koefficienter för rutregression, en för konfidenspoäng per ankare. Kvantiseringsparametrarna beskriver hur dessa int8-värden mappas till de reella flyttal som nätverket tränades mot; efterbehandlaren använder dem för att upphäva kvantiseringen innan rutorna avkodas.
Varje egenskap är den enda sanningskällan för det den beskriver. Skript läser input_shape för att veta vad de ska fånga in, läser output_scale och output_zero_point för att avkoda tensorer för hand, och läser labels för läsbara klassnamn – aldrig hårdkodade, aldrig antagna.