2016-07-04 41 views
7

Sto provando a riqualificare il modello di Inception v3 in tensorflow per le mie categorie personalizzate. Ho scaricato alcuni dati e li ho formattati in directory. Quando corro, lo script python crea colli di bottiglia per le immagini, e poi quando viene eseguito, nel primo passaggio di addestramento (passaggio 0) presenta un errore critico, in cui prova a modulo per 0. Appare nella funzione get_image_path quando calcola il mod_index, che è index% len (category_list) quindi la category_list deve essere a destra?CRITICO: tensorflow: la categoria non ha immagini - convalida

Perché sta succedendo e come posso impedirlo?

EDIT: Ecco il codice esatto che sto vedendo dentro finestra mobile

2016-07-04 01:27:52.005912: Step 0: Train accuracy = 40.0% 
2016-07-04 01:27:52.006025: Step 0: Cross entropy = 1.109777 
CRITICAL:tensorflow:Category has no images - validation. 
Traceback (most recent call last): 
    File "tensorflow/examples/image_retraining/retrain.py", line 824, in <module> 
    tf.app.run() 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/platform/app.py", line 30, in run 
    sys.exit(main(sys.argv)) 
    File "tensorflow/examples/image_retraining/retrain.py", line 794, in main 
    bottleneck_tensor)) 
    File "tensorflow/examples/image_retraining/retrain.py", line 484, in get_random_cached_bottlenecks 
    bottleneck_tensor) 
    File "tensorflow/examples/image_retraining/retrain.py", line 392, in get_or_create_bottleneck 
    bottleneck_dir, category) 
    File "tensorflow/examples/image_retraining/retrain.py", line 281, in get_bottleneck_path 
    category) + '.txt' 
    File "tensorflow/examples/image_retraining/retrain.py", line 257, in get_image_path 
    mod_index = index % len(category_list) 
ZeroDivisionError: integer division or modulo by zero 

risposta

10

Fix:

Il problema accade quando si ha meno il numero di immagini in uno dei tuoi sottocartelle.

Ho riscontrato lo stesso problema quando il numero totale di immagini in una particolare categoria era inferiore a 30, provare ad aumentare il numero di immagini per risolvere il problema.

Motivo:

Per ogni etichetta (cartella secondaria), tensorflow cerca di creare 3 categorie di immagini (treni, test e validazione) e pone le immagini sotto di essa sulla base di un valore di probabilità (calcolato utilizzando hash del nome dell'etichetta).

Un'immagine viene inserita nella cartella della categoria solo se il valore di probabilità è inferiore alla dimensione della categoria (Train, Test o validation).

Ora se il numero di immagini all'interno di un'etichetta è inferiore (ad esempio 25), la dimensione di convalida viene calcolata come 10 (impostazione predefinita) e il valore di probabilità è in genere maggiore di 10 e quindi nessuna immagine viene inserita nel set di convalida.

Più tardi, quando tutti i colli di bottiglia vengono creati e tf sta cercando di calcolare la precisione di convalida, in primo luogo lancia un messaggio di log fatale:

CRITICO: tensorflow: Categoria non ci sono immagini - convalida.

e quindi continua a eseguire il codice e si arresta in modo anomalo mentre tenta di dividere per dimensione dell'elenco di convalida (che è 0).

+0

Grazie per la spiegazione. Non capisco cosa intendi con "Un'immagine viene posizionata se il valore di probabilità è inferiore alla dimensione della categoria (Train, Test o validazione)." anche se. Poiché tutte le immagini sono etichettate, TF non accantonerebbe solo una parte delle immagini per l'addestramento, il test e la convalida? – DarylWM

+1

Mi spiace, intendevo, Un'immagine viene inserita in uno dei treni, test o convalida in base al valore di probabilità. –

+0

Ho modificato la mia risposta per riflettere quanto sopra. BTW se la spiegazione soddisfa la risposta puoi marcare la risposta? –

1

Per me, questo errore è stato causato dall'avere cartelle nella directory di formazione che non contenevano immagini. Stavo seguendo lo stesso tutorial "Poets" e ho finito per mettere le directory con le sottodirectory nella directory image. Una volta rimossi quelli e posto solo le directory con le immagini direttamente in esse (senza sub dir) l'errore non si verificava più e sono riuscito ad addestrare con successo il mio modello.

2

Stavo cercando di allenarmi usando il mio set di immagini (foto di cani invece di fiori) e mi sono imbattuto in questo stesso problema.

ho identificato che il problema per me ha finito per essere che i miei nomi delle cartelle (nomi di categoria) non erano presenti nel file imagenet_synset_to_human_label_map.txt che viene caricato nei dati nascita che stiamo modificando.

Cambiando il nome della mia cartella di immagini da bichon a barboncino, questo ha iniziato a funzionare, poiché barboncino si trova nella mappa iniziale e bichon no.

3
  1. Questo succede se si dispone di un numero di immagini inferiore. Come suggerito da Ashwin, hanno almeno 30 immagini.

  2. Anche i nomi della cartella sono importanti. In qualche modo il nome della cartella non può avere un trattino basso (_)

es. Questi nomi non hanno funzionato: dettol_bottle, dettol_soap, dove_soap, lifebuoy_bottle

Questi nomi hanno lavorato: dettolbottle, dettolsoap, dovesoap, lifebuoybottle

1

Per me è stato un "-" nei miei nomi delle cartelle. Nel momento in cui l'ho corretto, l'errore è svanito.

5

Ho avuto lo stesso problema durante l'esecuzione di retrain.py e quando ho impostato l'argomento --model_dir in modo errato e la directory iniziale è stata creata nella directory flower_photos.

Controllare se vi sono delle directory nella directory flower_photos senza immagini.

+0

Ho avuto questo errore esatto, e questo è stato il motivo esatto (corretto) che ho avuto l'errore. – simusid

+1

Questa risposta è per un problema simile con una descrizione dell'errore molto simile ma non per uno dalla domanda precedente. Questo è quello che ho ottenuto e risolto con la soluzione @Praveen: 'CRITICO: tensorflow: l'inizio dell'etichetta non ha immagini nella convalida della categoria. Così ho messo la cartella di partenza nella cartella delle immagini, che era sbagliata. Ad ogni modo +1 per guidarmi. – denys

0

Vorrei anche aggiungere la mia esperienza:

Non ce l'ho spazi Per me, ha funzionato quando tutto un nome di cartella conteneva era una a caratteri z, senza spazi, senza simboli, senza niente'.

E.g `I'm a folder 'è sbagliato. Tuttavia, "ImAFolder" funzionerebbe.

0

Come ha risposto Ashwin Patti, esiste la possibilità che la directory divisa per la convalida non abbia immagini a causa della mancanza di immagini nella directory dell'etichetta originale.

Questa spiegazione è supportata dal messaggio di avviso quando si tenta di riqualificare con le etichette che hanno meno di 20 immagini:

ATTENZIONE: cartella ha meno di 20 immagini, che possono causare problemi.

1

Ho modificato retrain.py per assicurare che almeno c'è un'immagine in validazione (linea 201)

if len(validation_images) == 0: 
    validation_images.append(base_name) 
elif percentage_hash < validation_percentage: 
+0

perfetto, grazie !!! –