Passa ai contenuti principali

Un porting di grandi promesse


Il mio Random Forest raggiungeva il 92% di accuracy su cerchi e croci. 
Sul telefonino, le prime versioni davano predizioni puramente casuali. 
Il problema non era il modello, ma tutto il resto! In Python scrivi  model.predict(X_test) e funziona. 
Su Android devi ricostruire l'intera pipeline da zero. 
Il modello è solo l'ultimo pezzo di un sistema che include acquisizione sensori, preprocessing, feature extraction e normalizzazione. 
Se uno di questi pezzi diverge anche minimamente dal training, il modello vede dati da un'altra distribuzione e le performance crollano.
Ho fatto convertire dall’IA il Random Forest in ONNX, un formato universale per modelli ML. 
La conversione preserva perfettamente gli alberi decisionali, e ONNX Runtime su Android gestisce l'inferenza in modo efficiente, ma questo risolve solo il problema di far girare il modello, non quello di dargli gli input giusti.
Le 122 feature del mio modello includevano statistiche temporali, trasformate di Fourier, correlazioni tra assi e metriche specifiche per distinguere movimenti circolari da lineari. In Python erano venti righe di NumPy e SciPy. In Kotlin l'IA ha dovuto reimplementare anche la DFT, perché Android non fornisce una libreria FFT standard integrata.
Il vero problema era garantire che ogni calcolo producesse esattamente lo stesso risultato. 
La media è facile, ma skewness e kurtosis hanno formule con correzioni per piccoli campioni che devono essere identiche.
L’IA ha tradotto riga per riga lo script Python originale, testando ogni feature individualmente per verificare che i valori combaciassero. Normalizzare le feature non è opzionale, è critico. 
Durante il training, StandardScaler calcola media e deviazione standard di ogni feature e le trasforma in distribuzioni a media zero e varianza uno. Sullo smartphone devi applicare la stessa trasformazione usando gli stessi parametri del training, non ricalcolandoli sui nuovi dati.
Ho esportato i parametri dello scaler in JSON caricandoli negli assets dell'app. Prima dell'inferenza, ogni feature passa attraverso (x - mean)/scale usando i valori del training. Sembra banale ma è fondamentale: usare parametri diversi equivale a dare al modello input completamente sballati.
ONNX Runtime restituisce le probabilità dei classificatori sklearn come dizionari wrapped in strutture custom. Il primo tentativo di parsing restituiva sempre 0.5 per entrambe le classi perché il cast falliva silenziosamente. Ho dovuto usare reflection per accedere ai valori corretti.
Questi bug sono subdoli perché il codice compila e gira, ma semplicemente produce risultati sbagliati!
Anche con tutto corretto, il modello prediceva prevalentemente una sola classe.
La causa probabile: lunghezza delle sequenze: feature statistiche sono sensibili al numero di campioni. 
Se il training usava cento timesteps e l'app ne raccoglie duecento, mean e std cambiano anche con gesti identici. Android campiona i sensori a frequenza variabile, rendendo il matching perfetto quasi impossibile senza controllare esattamente i parametri del training.
Deployment non è conversione di formato. È ricostruzione fedele di una pipeline. Ogni trasformazione applicata ai dati deve essere documentata e riproducibile. StandardScaler, window size, frequenza di campionamento, ordine delle feature: tutti questi dettagli invisibili nel notebook Jupyter diventano critici quando il modello esce dall'ambiente di sviluppo.
ONNX funziona bene per la portabilità del modello, ma non risolve il problema di portabilità della pipeline. La soluzione più robusta è probabilmente addestrare direttamente con dati dallo smartphone target, eliminando le discrepanze alla fonte. Altrimenti ogni step richiede test accurati per verificare la corrispondenza numerica tra ambienti.
Nonostante le difficoltà, vedere il modello rispondere in tempo reale sul proprio dispositivo ha un valore che va oltre i numeri di accuracy.

Post popolari in questo blog

Salmoni, scarpette, cetrioli e altro

Tutto il testo contenuto in questa pagina è stato pensato e scritto dall'autore del blog.   1. Come il salmone 2. Ooops! 3. Le scarpette hi-tech 4. Equivoci contemporanei 5. I saccenti 6. Medaglie di legno 7. La festività del Nulla 8. Gli aggiornamenti elettronici del Libro dell'Apocalisse 9. Dubbi ne ho 10. La maieutica del vulcaniano 11. Un piacevole vasetto di miele 12. Povere sfere 13. Caos comune mezzo gaudio 14. La fontana senza volti 15. Il piromane super beffardo 16. Boom di serpenti 17. Sistemi in via di degradazione 18. Il gatto nero 19. Alain Delon è ancora vivo? 20. Per sempre con i cani 21. Eventi imprevedibili 22. I robot sottomessi 23. Lady Gaga e Bruno Mars incantano 24. Definizioni mancate 25. Il mio nemico drone 26. Errore di valutazione 27. Ringraziamenti 28. Cari cetrioli, vi scrivo 29. Boom di detective 30. Gli UFO trascurati 31. Il grande salto delle rane 32. La malattia artificiale 33. Homo consumens 34. Lacune informatiche 35. Sei troppo! 36. ...

Generatore Markmap HD

Pagina per il download di  Memento Lite Generatore Markmap Avanzato - Specifiche per l'utente finale Scopo principale: l'applicazione “Generatore Markmap Avanzato” permette agli utenti di trasformare testo scritto in formato Markdown in mappe mentali interattive. Offre funzionalità per creare, visualizzare, salvare, modificare, gestire ed esportare queste mappe mentali in vari formati. Interfaccia utente: l'interfaccia è strutturata nelle seguenti sezioni principali: Link al blog esterno: un link “🌐 Visita il Blog: Pensieri d'assestamento” che apre il blog associato in una nuova scheda. Intestazione (Header): Titolo: “Generatore Markmap Avanzato”. Sottotitolo: “Trasforma, salva e condividi il tuo testo Markdown in mappe mentali interattive”. Area Principale dei Contenuti: divisa in due pannelli affiancati (o impilati su schermi piccoli): Pannello di Input (Editor Markdown): Titolo: “✏️ Editor Markdown”. Area di Testo: un campo multiriga dove l...

Neural Tic-Tac-Toe Lab

Questo articolo presenta l'implementazione di una rete neurale specializzata nel gioco del tris (tic-tac-toe), addestrata mediante una metodologia innovativa basata sull'enumerazione completa degli stati di gioco. L'approccio supera le limitazioni dei metodi tradizionali di campionamento casuale, garantendo una copertura totale dello spazio delle configurazioni possibili. Struttura della rete neurale La rete implementata utilizza un'architettura feed-forward compatta con 9 neuroni di input, 16 neuroni nel layer nascosto e 9 neuroni di output. I neuroni di input ricevono la rappresentazione numerica dello stato della board (-1, 0, 1 per ciascuna delle 9 caselle), mentre i neuroni di output producono valutazioni numeriche per ogni possibile mossa. Il layer nascosto utilizza 16 neuroni con funzione di attivazione relu per introdurre capacità di apprendimento non-lineare. La rete contiene complessivamente 297 parametri: 144 pesi per le connessioni input-hidden, 16 bi...