Blog.

Guida Transfer Learning Suite in Tensorflow-gpu | Machine Learning


Autore
Andrea Provino
Data
Tempo di lettura
6 minuti
Categoria
Guide

transfer_learning_tensorflow_gpu_guida_italiano_guide_step_github

In questa guida useremo un modello già istruito nel riconoscere oggetti, insegnandoli ad individuare uno specifico elemento scelto da noi. La tecnica è quella del Transfer Learning. 

Il nuovo modello sarà in grado riconoscere solo i nuovi oggetti, e non più i precedenti.

Versione in KERAS.

Requisti

Prima di partire, accertati che tutto sia pronto e configurato. Avrai bisogno di molta potenza di calcolo, quindi un buon processore e una GPU con parecchia memoria dedicata. 

Anche la RAM riveste un ruolo importante. 8 GB sono il minimo per ottenere risultati decenti.

Infine, ma non per questo meno importante, la suite di software. Se non lo hai ancora fatto installa, seguendo le guide precedenti, Tensorflow-gpu, CUDA Toolkit e cudnn. Assicurati di avere una versione di python compatibile (3.5 o 3.6) e rilassati. Ti servirà anche un buon editor di testo, io ti consiglio Atom.

Elegante, minimial ed estremamente versatile.

Download Repository [Suite]

Collegati al sito di GitHub e scarica la mia Repository, all’interno trovi tutti i file già configurati per eseguire il training.

Estrai la repository e crea al suo interno sei cartelle chiamate esattamente in questo modo:

-Csv
-Dataset
-New_model
-Pre_train_model
-Training
-Pre_trained

Downlaod Repository [model]

La mia repostiory ha una sola funzione: rendere la procedura di creazione di un nuovo modello ordinata e facilmente comprendibile. Tuttavia, lo script train.py richiede numerosi altri scripts, tutti contenuti nella repository Model da cui ho preso alcuni file. 

Collegati  GitHub e scarica:

Tensorflow Model Repository | Download

E’ necessario che tu scairichi anche questa repository, ovunque tu voglia.

Aggiungi variabili d’ambiente

Cerca “variabili d’ambiente” nella barra di ricerca di windows e apri il menu. Aggiungi la variabile:

PYTHONPATH: C:\[...]\models-master\research;C:\[..]\models-master\research\slim

Modificando la lettera del disco se serve e aggiugendo il percorso in cui hai estratto la repostiory.

Potrebbe essere inoltre necessario installare la seguente libreria:

pip install absl-py

Google Protub

Collegati al sito, e scarica il file:

v3.4.0 Protoc | Download

Estrai il file protoc.exe all’interno della cartella:

models-master/research/

Quindi digita, in models-master/research:

protoc object_detection/protos/*.proto --python_out=.

Download Dataset

Scegli il tuo dataset, e scaricalo.

Attenzione: se vuoi limitarti a scaricare tutti i file e apportare il minimo cambiamento agli script, occore che il tuo dataset sia strutturato in questo modo:

  • le immagini sono contenute in due cartelle, una denominata “train” l’altra “test”. Puoi anche avere un dataset con una sola cartella, e poi dividere succesivamente le immagini con un rapporto di 10:1, ogni dicei immagini di train usane una per il test.
  • ogni immagine deve essere corredata del proprio file *.xml, cioè un documento contenente in PASCAL_VOC Format i limiti dell’oggetto su cui effettuare il training del modello. Per maggiori info, consulta questa guida.

Alcuni consigli:

  • assicurati che il dataset sia composto da un numero sufficiente di elementi. Il minimo è intorno a 160.
  • controlla che il peso delle immagini non sia eccessivo. Tutto dipende dalla memoria che hai a disposizione nella fase di training. Se le immagini fossero troppe o troppo pesanti, potresti riscontrare problemi come il ResourceExhaustedError o l’OOM.

Io userò come esempio il macncheese dataset di sentdex, che contiene 142 file di training e 12 di testing, corredati di xml già pronto all’uso.

Creation training files

Per poter inziziare il training, dobbiamo creare alcuni file. Inziamo generando i file CSV a partire dai *.xml. 

Per prima cosa apri l’archivio contenente il dataset, ed estrai le cartelle ‘train‘ e ‘test‘ in ‘Dataset‘ (GitHub Repository), in modo che alla fine tu abbia una congiurazione identica a questa:

Transfer-learning-tensorflow
-Dataset
--train
---image1.jpg
---image1.xml
---image2.jpg
---image2.xml
---[...]
--test
---image4.jpg
---image4.xml
---image5.jpg
---image5.xml
---[...]
-Training
-Csv
-Pre_train_model
-[..]

Dato che l’accuratezza non è mai troppa, ti fornisco alcuni dettagli aggiuntivi che potrebbero farti risparmiare ore preziose.

E’ fondamentale che ad ogni immagine, sia in ‘train’ che in ‘test’, corrisponda un file *.xml con lo stesso nome. Per essere chiari:

Esempio:
image : 9ycfdbv.jpg
xml    : 9ycfdbv.xml

CSV files

Fatto ciò, esegui lo script ‘xml_to_csv.py‘. All’interno della cartella ‘Csv’ si creano due file:

train_fornewmodel.scv 
test_fornewmodel.csv

Ora che hai i file csv, crea quelli record.

Record files

Apri con Atom il file di script generate_tfrecord.py

Sostituisci in def class_text_to_int ‘new_label’ con la label che intendi identificare. Puoi anche aggiungerne di nuove, ma ovviamente è necessario che queste siano presenti nei file *.csv, e quindi ancora prima negli *.xml, che sai usando.

Io modifico come segue:

Ora, non ti resta che salvare il file (CTRL+S) ed eseguire lo script. 

Nella cartella Training si creano due file:

test.record
train.record

pbtxt file

Apri il file config.pbtxt e modificalo in base alle tue impostazioni, aggiungendo eventualmente nuovi elementi. Nel mio caso, all’interno del file ho:

item {
id: 1
name: 'macncheese'
}

Pre-Train Model

E’ arrivato il momento di scegliere il modello di partenza. Ce ne sono molti, ognuno con le sue peculiarità. Io consiglio di partire dal ssd_mobilnet_v1, perché è leggero e ricco di dati.

ssd_mobilenet_v1_coco| Donwload Link

Scarica ed estrai il modello in Pre_train_model

Config file

Ora, il file per impostare i parametri di configurazione. Queste sono le modifiche che devi apportare usando il mobilenet v1, qualora il modello di patenza fosse diverso, potresti dover apportare modifiche drastiche al file.

Apri testing.config

Riga 3

num_classes: x

Sostituisci ‘x’ con il numero di classi che intendi usare

Riga 77

type: 'x'

Questa riga va modificata in base al modello usato. Avendo scelto il ssd_mobilenet_coco_v1:

type: 'ssd_mobilenet_v1'

Riga 152

fine_tune_checkpoint: "Pre_train_model/model.ckpt"

Questa riga NON va modificata se hai seguito tutti i passaggi alla lettera, ma la segnalo perché è quella da cambiare qualora la catella del modello estratto fosse diversa. Stessa cosa per le righe 166, 168, 177 e 179.

Riga 172

num_examples: x

Il numero di immagini di test, nel mio caso 12.

Salva il file.

Start training

Per avviare la procedura di trainig digita dal prompt:

python train.py --logtostderr --train_dir=training/ --pipeline_config_path=training.config

e per tenere sotto controllo la procedura:

tensorboard --logdir=training/ --host localhost --port 8080

puoi consultare i dati da browser all’indirizzo Tensorboard

End training

Quando il loss raggiunge un valore inferiore a 1, ed è stabile, la procedura di training può dirsi completata. Passiamo ora a generare i file per analizzare i nuovi oggetti.

Generating Frozen Graph

Quello che andrai a fare sarà generare il frozen graph, ossia un’unico file contenente il modello e i weights così da poter essere facilmente implementato nei tuoi programmi di machine learning.

Digita quindi:

python export_inference_graph.py --input_type image_tensor --pipeline_config_path training.config --trained_checkpoint_prefix training/model.ckpt-???? --output_directory New_model

‘????’ dovranno essere sostituiti con il numero dell’ultimo model chekpoint, che dipende sostanzialemente dal tempo di training: più è lunga la fase, più alto sarà il valore.

Eseguito lo script, all’interno della cartella New_model otterrai il nuovo frozen_inference_graph.pb che puoi usare nei tuoi progetti.

Siamo arrivati al termine di questa procedura!

Alla prossima.

Un caldo abbraccio, Andrea.l


Ultimi post

Patricia Merkle Trie

Il Practical Algorithm To Retrieve Information Coded In Alphanumeric Merkle Trie, o Patricia Merkle Trie è una struttura dati chiave-valore usatada Ethereum e particolarmente efficiente per il salvataggio e la verifica dell’integrità dell’informazione. In questo post ne studieremo le caratteristiche. Prima di procedere, ci conviene ripassare l’introduzione al Merkle Tree nella quale abbiamo chiarito il […]

Andrea Provino
ethereum-patricia-merkle-tree
Tree Data Structure: cos’è un Merkle Tree

Un Merkle Tree è una struttura dati efficiente per verificare che un dato appartenga a un insieme esteso di elementi. È comunemente impiegato nelle Peer to Peer network in cui la generazione efficiente di prove (proof) contribuisce alla scalabilità della rete. Capire i vantaggi di questa struttura ci tornerà utile nel nostro percorso di esplorazione […]

Andrea Provino
merkle-tree-cover
UTXO: come funziona il modello Unspent Transaction Outputs

Per tenere traccia dei bilanci utente, la blockchain di Bitcoin sfrutta un modello di contabilità definito UTXO o Unspent Transaction Outputs. In questo articolo ne esaminiamo le caratteristiche. Ogni blockchain è dotata di un sistema di contabilità, un meccanismo attraverso cui tenere traccia dei bilanci di ciascun utente. I due grandi modelli di riferimento nel […]

Andrea Provino
bitcoin-utxo
Cos’è Ethereum

Possiamo definire Ethereum come una macchina a stati distribuita che traccia le transizioni di un archivio dati general-purpose (i.e. una memoria in grado di registrare qualsiasi dato esprimibile come coppia di chiave e valore o key-value) all’interno della Ethereum Blockchain. È arrivato il momento di esplorare uno dei progetti tecnologici più innovativi e interessanti degli […]

Andrea Provino
ethereum