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).
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 .tfrecord
Dateien 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!
Antworten:
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.
quelle