Perché il mio modello Keras impara a riconoscere lo sfondo?


9

Sto cercando di addestrare l' implementazione di Keras di Deeplabv3 + su Pascal VOC2012, usando il modello predefinito (che è stato anche addestrato su quel set di dati).

Ho ottenuto strani risultati con l'accuratezza che converge rapidamente in 1.0:

5/5 [==============================] - 182s 36s/step - loss: 26864.4418 - acc: 0.7669 - val_loss: 19385.8555 - val_acc: 0.4818
Epoch 2/3
5/5 [==============================] - 77s 15s/step - loss: 42117.3555 - acc: 0.9815 - val_loss: 69088.5469 - val_acc: 0.9948
Epoch 3/3
5/5 [==============================] - 78s 16s/step - loss: 45300.6992 - acc: 1.0000 - val_loss: 44569.9414 - val_acc: 1.0000

Testare il modello offre anche una precisione del 100%.

Ho deciso di tracciare previsioni sullo stesso set di immagini casuali prima e dopo l'allenamento e ho scoperto che il modello è incoraggiato a dire che tutto è solo uno sfondo (questa è la 1a classe in Pascal VOC2012).

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Sono abbastanza nuovo per l'apprendimento profondo e avrei bisogno di aiuto per capire da dove questo potrebbe venire.

Ho pensato che forse potrebbe essere la mia funzione di perdita, che ho definito come:

def image_categorical_cross_entropy(y_true, y_pred):
    """
    :param y_true: tensor of shape (batch_size, height, width) representing the ground truth.
    :param y_pred: tensor of shape (batch_size, height, width) representing the prediction.
    :return: The mean cross-entropy on softmaxed tensors.
    """
    return tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=y_pred, labels=y_true))

Sono un po 'incerto sul fatto che i miei tensori abbiano la forma giusta. Sto usando l'API del set di dati di TF per caricare i .tfrecordfile e il mio tensore delle annotazioni è di forma (batch_size, height, width). Sarebbe (batch_size, height, width, 21)quello che serve? Altri errori dall'interno del modello sorgono quando provo a separare l'immagine di annotazione in un tensore contenente 21 immagini (una per ogni classe):

tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [12,512,512,21] vs. [12,512,512]
         [[Node: metrics/acc/Equal = Equal[T=DT_INT64, _device="/job:localhost/replica:0/task:0/device:GPU:0"](metrics/acc/ArgMax, metrics/acc/ArgMax_1)]]
         [[Node: training/Adam/gradients/bilinear_upsampling_2_1/concat_grad/Slice_1/_13277 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:GPU:1", send_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device_incarnation=1, tensor_name="edge_62151_training/Adam/gradients/bilinear_upsampling_2_1/concat_grad/Slice_1", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:1"]()]]

Grazie per l'aiuto!


5
Alcuni elementi da considerare qui, quasi non so da dove cominciare (1) stai usando una dimensione del campione di 5 per l'allenamento ??? (2) Che cosa stai facendo, preelaborazione delle tue immagini? Ho la sensazione che la risposta risieda in questo e (3) dovresti fornire molte più informazioni sul tuo modello. Quanti campioni etichettati hai? Quante possibili categorie? Hai un set di allenamento equilibrato? (4) la tua precisione di 1.0 in pratica non significa nulla perché la tua perdita è altissima e in aumento. La perdita dovrebbe diminuire con il miglioramento della precisione.
I_Play_With_Data

(1) Sto usando gruppi di dimensioni 12 ma questo è un po 'irrilevante, penso. Ho mostrato solo 3 piccole epoche di soli 5 passaggi qui perché è proprio quanto velocemente converge. (2) La mia preelaborazione consiste in alcuni aumenti e riscalamenti (eventualmente ritagli) a 512x512 per ogni immagine e la relativa annotazione associata. (3) ci sono circa 11.500 immagini etichettate in Pascal VOC 2012. Concesso che la maggior parte dei documenti raggiunge l'85% + mIOU in questo set di dati, suppongo che sia bilanciato. Ci sono 20 diverse categorie in questo set di dati più una per lo sfondo o «ambiguo», per un totale di 21.
Matt

Sono curioso Hai trovato il motivo dei risultati del tuo modello?
Mark.F,

3
Se hai condiviso il tuo codice, sarebbe possibile trovare l'errore.
Dmytro Prylipko l'

1
Il fatto che un modello pre-addestrato trovi un modo per ottenere la precisione del 100% entro 3 epoche, usando gli stessi dati usati in origine, mi fa pensare che il bug sia che le etichette di allenamento sono sbagliate, forse tutte impostate sull'etichetta corrispondente allo sfondo. In ogni caso, dai un'occhiata a questo argomento , in cui le persone discutono dei loro problemi e soluzioni per mettere a punto il modello. Il modello non è necessariamente rotto e il bug batchnorm in Tensorflow può essere risolto.
n1k31t4

Risposte:


1

Il tuo modello è troppo adatto. Ogni epoca ha solo 5 immagini. Il modello sta "memorizzando" la risposta per ogni immagine.

Al fine di ridurre al minimo la possibilità di un overfitting, aumentare il numero di immagini. Dovrebbero esserci diverse migliaia di immagini di esempio per ogni categoria di oggetti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.