Wie kann AUC mit einer Softmax-Ausgabe, spärlichen Integer-Labels und categorical_crossentropy für die binäre KlassifiziPython

Python-Programme
Anonymous
 Wie kann AUC mit einer Softmax-Ausgabe, spärlichen Integer-Labels und categorical_crossentropy für die binäre Klassifizi

Post by Anonymous »

Ich arbeite an einer binären Bildklassifizierungsaufgabe mit TensorFlow/Keras (

Code: Select all

TensorFlow version: 2.19.0
). Meine Modellarchitektur ist ein multimodaler Aufbau mit zwei Eingabezweigen (CT- und PET-Scans) und die letzte Ebene ist eine dichte Ebene mit Softmax-Aktivierung und num_classes=2. Ich kompiliere das Modell mit sparse_categorical_crossentropy für die Verlustfunktion.
Meine Daten werden mithilfe eines benutzerdefinierten tf.keras.utils.Sequence-Datengenerators in das Modell eingespeist. Dieser Generator ist so konzipiert, dass er für jede Stichprobe in einem Stapel spärliche Ganzzahlbezeichnungen (0 oder 1) zurückgibt, die mit dem sparse_categorical_crossentropy-Verlust übereinstimmen.
Das Problem:
Wenn ich das Modell kompiliere und trainiere, stoße ich während des Aufrufs von model.fit() auf einen InvalidArgumentError, insbesondere innerhalb des tf.keras.metrics.AUC Berechnung. Der Traceback weist durchweg auf eine interne Nichtübereinstimmung der Tensorform hin:

Code: Select all

InvalidArgumentError: Graph execution error:
Detected at node UnsortedSegmentSum_1 defined at ...
data.shape = [4] does not start with segment_ids.shape = [8]
     [[{{node UnsortedSegmentSum_1}}]] [Op:__inference_multi_step_on_iterator_XXXXX]
Was ich versucht habe:
  • Direktes tf.keras.metrics.AUC: Anfangs habe ich tf.keras.metrics.AUC direkt verwendet. Dies verursachte den InvalidArgumentError.
  • Code: Select all

    sparse_labels=True
    (Versucht):[/b] Ich habe versucht, sparse_labels=True an tf.keras.metrics.AUC zu übergeben, aber dies führte zu einem TypeError: AUC.__init__() hat ein unerwartetes Schlüsselwortargument „sparse_labels“ erhalten, was darauf hinweist, dass dieses Argument entweder veraltet ist oder in meiner TF-Version nicht unterstützt wird.
  • Benutzerdefiniert AUC-Metrik: Um die spärlichen Beschriftungen und die Softmax-Ausgabe explizit zu verarbeiten, habe ich eine CustomAUC-Klasse implementiert. Diese benutzerdefinierte Metrik erbt von tf.keras.metrics.AUC und extrahiert in ihrer update_state-Methode die Wahrscheinlichkeit der positiven Klasse (Index 1) aus der Softmax-Ausgabe des Modells (

    Code: Select all

    y_pred
    ), bevor es an den update_state der übergeordneten AUC-Klasse übergeben wird.
Trotz der Verwendung dieser CustomAUC-Metrik bleibt der InvalidArgumentError während des Trainings bestehen, was darauf hindeutet, dass möglicherweise ein tieferes Problem mit der Interaktion von tf.keras.metrics.AUC mit der Sequence-Ausgabe vorliegt spärliche Beschriftungen in diesem Zusammenhang.

Relevante Codeausschnitte:
So erzeugt mein Datengenerator Beschriftungen (Hinweis: Batch_size ist in meinem Setup für diese Generatoren normalerweise 4):

Code: Select all

# Inside MultimodalDataGenerator.__getitem__ method
# ... (code to load and preprocess CT and PET images)

# Generates sparse integer labels (0 or 1)
dummy_labels = np.random.randint(0, 2, self.batch_size)

return {'ct_input': X_ct, 'pet_input': X_pet}, dummy_labels
Dies ist die Implementierung meiner CustomAUC-Metrik. Die Schlüssellogik liegt in der Methode update_state, wobei y_pred[:, 1] verwendet wird, um die positive Klassenwahrscheinlichkeit zu erhalten:

Code: Select all

import tensorflow as tf

class CustomAUC(tf.keras.metrics.AUC):
    def __init__(self, name='auc', dtype=None):
        super().__init__(name=name, dtype=dtype)

    def update_state(self, y_true, y_pred, sample_weight=None):
        # y_pred is expected to be a softmax output, e.g., [batch_size, num_classes]
        if y_pred.shape[-1] > 1:
            # For binary classification, assuming positive class is at index 1
            y_pred_positive = y_pred[:, 1]
        else:
            # If y_pred is already single-dimensional (e.g., [batch_size]), use it directly
            y_pred_positive = y_pred

        # Call the parent class's update_state with the single-dimensional prediction
        super().update_state(y_true, y_pred_positive, sample_weight=sample_weight)
Und schließlich, wie das Modell mit sparse_categorical_crossentropy und meiner CustomAUC-Metrik kompiliert wird:

Code: Select all

model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4),
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy', CustomAUC(name='auc')] # Using the custom AUC
)
Warum tf.keras.metrics.AUC (sogar eine benutzerdefinierte Version, die positive Klassenwahrscheinlichkeiten extrahiert) möglicherweise mit InvalidArgumentError fehlschlägt, wenn es mit sparse_categorical_crossentropy und einer Sequenz auf diese Weise verwendet wird?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post