7.4. Een model laden

ml.Model leest een modelbestand uit het flashgeheugen, parseert het, reserveert het RAM dat het netwerk tijdens de inferentie nodig heeft en geeft een object terug dat alles bevat wat de rest van het script over het geladen netwerk moet weten.

7.4.1. De constructor

De constructor neemt een pad en een optionele post-processor:

model = ml.Model("/rom/blazeface_front_128.tflite",
                 postprocess=BlazeFace())

Modellen op /rom/ (het in flashgeheugen aanwezige bestandssysteem) worden ter plaatse gelezen: de gewichten van het netwerk blijven in het flashgeheugen en het geladen model gebruikt alleen het RAM ter grootte van de tensor-arena. Modellen op /sdcard/ worden bij het laden naar RAM gekopieerd, zodat de totale kosten gelijk zijn aan de modelbestandsgrootte plus de tensor-arena. Beide paden werken; de afweging is RAM.

Als er een naast gelegen .txt-bestand met dezelfde basisnaam bestaat, wordt de inhoud daarvan automatisch in labels geladen. Het sleutelwoord postprocess= registreert een callable die predict() na elke inferentie uitvoert.

7.4.2. Alleen-lezen eigenschappen

Een geladen model stelt een kleine set alleen-lezen eigenschappen beschikbaar die het netwerk beschrijven zonder dat iemand het uitvoert.

Bestand en geheugen.

  • len – de grootte van het modelbestand op schijf, in bytes.

  • ram – de grootte van de tensor-arena die het netwerk nodig heeft voor zijn tussenliggende activaties tijdens de inferentie, in bytes.

Invoertensoren.

  • input_shape – een lijst van tuples, één per invoertensor, die de vorm aangeeft die het netwerk verwacht. Visienetwerken hebben één invoer met vorm (1, H, W, C).

  • input_dtype – lijst van dtype-codes van één teken ('b' int8, 'B' uint8, 'h' int16, 'H' uint16, 'f' float32), één per invoer.

  • input_scale en input_zero_point – de kwantisatieparameters die converteren tussen de reëelwaardige invoer waarop het netwerk is getraind en de integer-representatie waartegen de cam draait.

Uitvoertensoren. Spiegelbeeld van de invoerset: output_shape, output_dtype, output_scale, output_zero_point. Detectienetwerken produceren twee of drie uitvoertensoren (begrenzingsvakken, betrouwbaarheidsscores, soms klassekansen); classificatienetwerken produceren er één.

Extra’s. labels is de lijst met klassenamen die uit het naast gelegen .txt-bestand is geladen, of None. postprocess is de geregistreerde post-processor, of None.

7.4.3. BlazeFace inspecteren

Het meegeleverde BlazeFace-model laden en elke eigenschap afdrukken levert de werkelijke getallen op:

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)

De getallen identificeren de interface van het netwerk concreet: één enkele (1, 128, 128, 3) int8-invoertensor en twee int8-uitvoeren – één voor de coëfficiënten van de box-regressie, één voor de betrouwbaarheidsscores per anchor. De kwantisatieparameters beschrijven hoe die int8-waarden worden afgebeeld op de werkelijke floats waartegen het netwerk is getraind; de post-processor gebruikt ze om de kwantisatie ongedaan te maken voordat de begrenzingsvakken worden gedecodeerd.

Elke eigenschap is de enige bron van waarheid voor wat hij beschrijft. Scripts lezen input_shape om te weten waarop ze moeten vastleggen, lezen output_scale en output_zero_point om tensoren handmatig te decoderen, en lezen labels voor leesbare klassenamen – nooit hardcoded, nooit aangenomen.