Warum lernt mein Keras-Modell, den Hintergrund zu erkennen?

9

Ich versuche, diese Keras-Implementierung von Deeplabv3 + auf Pascal VOC2012 mithilfe des vorab trainierten Modells (das auch für diesen Datensatz trainiert wurde) zu trainieren.

Ich habe seltsame Ergebnisse mit einer Genauigkeit erzielt, die schnell auf 1,0 konvergiert:

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

Das Testen des Modells ergibt auch eine 100% ige Genauigkeit.

Ich entschied mich, Vorhersagen vor und nach dem Training auf denselben zufälligen Bildern zu zeichnen, und stellte fest, dass das Modell ermutigt wird, zu sagen, dass alles nur Hintergrund ist (das ist die 1. Klasse in Pascal VOC2012).

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Ich bin ziemlich neu im Deep Learning und würde Hilfe brauchen, um herauszufinden, woher das kommen könnte.

Ich dachte, dass es vielleicht meine Verlustfunktion sein könnte, die ich definiert habe als:

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))

Ich bin mir nicht sicher, ob meine Tensoren die richtige Form haben. Ich verwende die Dataset-API von TF, um .tfrecordDateien zu laden , und mein Annotationstensor hat die Form (batch_size, height, width). Wäre (batch_size, height, width, 21)was benötigt wird? Andere Fehler innerhalb des Modells treten auf, wenn ich versuche, das Anmerkungsbild in einen Tensor mit 21 Bildern zu unterteilen (eines für jede Klasse):

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"]()]]

Danke für deine Hilfe!

Matt
quelle
5
Einige Punkte, die hier zu beachten sind, ich weiß fast nicht, wo ich anfangen soll (1) Verwenden Sie eine Stichprobengröße von 5 für das Training? (2) Was, wenn überhaupt, machen Sie mit der Vorverarbeitung Ihrer Bilder? Ich habe das Gefühl, dass die Antwort darin liegt und (3) Sie müssten viel mehr Informationen über Ihr Modell bereitstellen. Wie viele etikettierte Proben haben Sie? Wie viele mögliche Kategorien? Hast du ein ausgewogenes Trainingsset? (4) Ihre Genauigkeit von 1,0 bedeutet im Grunde nichts, weil Ihr Verlust sehr hoch ist und zunimmt. Ihr Verlust sollte abnehmen, wenn sich Ihre Genauigkeit verbessert.
I_Play_With_Data
(1) Ich verwende Chargen der Größe 12, aber das ist meiner Meinung nach irrelevant. Ich habe hier nur 3 kleine Epochen mit nur 5 Schritten gezeigt, weil es so schnell konvergiert. (2) Meine Vorverarbeitung besteht aus einer Vergrößerung und Neuskalierung (möglicherweise Zuschneiden) auf 512 x 512 für jedes Bild und die zugehörige Anmerkung. (3) In Pascal VOC 2012 gibt es ungefähr 11.500 beschriftete Bilder. Zugegeben, die meisten Papiere erreichen 85% + mIOU in diesem Datensatz, ich würde davon ausgehen, dass er ausgewogen ist. Es gibt 20 verschiedene Kategorien in diesem Datensatz plus eine für den Hintergrund oder «mehrdeutig» für insgesamt 21.
Matt
Ich bin neugierig. Haben Sie den Grund für die Ergebnisse Ihres Modells gefunden?
Mark.F
3
Wenn Sie Ihren Code geteilt haben, ist es möglich, den Fehler zu finden.
Dmytro Prylipko
1
Die Tatsache, dass ein vorab trainiertes Modell einen Weg findet, innerhalb von 3 Epochen eine 100% ige Genauigkeit zu erzielen, wobei dieselben Daten verwendet werden, die ursprünglich verwendet wurden, lässt mich den Fehler vermuten, dass Ihre Trainingsetiketten falsch sind, möglicherweise alle auf das entsprechende Etikett gesetzt zum Hintergrund. Schauen Sie sich auf jeden Fall diesen Themen-Thread an , in dem die Leute ihre Probleme und Lösungen für die Feinabstimmung des Modells diskutieren. Das Modell ist nicht unbedingt kaputt und der Batchnorm-Fehler in Tensorflow kann behoben werden.
n1k31t4

Antworten:

1

Ihr Modell passt über. Jede Epoche hat nur 5 Bilder. Das Modell "speichert" die Antwort für jedes Bild.

Erhöhen Sie die Anzahl der Bilder, um das Risiko einer Überanpassung zu minimieren. Für jede Objektkategorie sollten mehrere tausend Beispielbilder vorhanden sein.

Brian Spiering
quelle