Code: Select all
TensorFlow version: 2.19.0Meine 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]
- Direktes tf.keras.metrics.AUC: Anfangs habe ich tf.keras.metrics.AUC direkt verwendet. Dies verursachte den InvalidArgumentError.
- (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.
Code: Select all
sparse_labels=True - 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 (), bevor es an den update_state der übergeordneten AUC-Klasse übergeben wird.
Code: Select all
y_pred
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
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)
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
)
Mobile version