Как можно правильно использовать AUC с выводом softmax, разреженными целочисленными метками и categorical_crossentropy дPython

Программы на Python
Ответить
Anonymous
 Как можно правильно использовать AUC с выводом softmax, разреженными целочисленными метками и categorical_crossentropy д

Сообщение Anonymous »

Я работаю над задачей классификации двоичных изображений, используя TensorFlow/Keras (

Код: Выделить всё

TensorFlow version: 2.19.0). Архитектура моей модели представляет собой мультимодальную установку с двумя входными ветвями (сканирование КТ и ПЭТ), а ее последним слоем является слой Dense
с активацией softmax и num_classes=2. Я компилирую модель с помощью sparse_categorical_crossentropy для функции потерь.
Мои данные передаются в модель с помощью специального генератора данных tf.keras.utils.Sequence. Этот генератор предназначен для возврата разреженных целочисленных меток (0 или 1) для каждой выборки в пакете, что соответствует потере sparse_categorical_crossentropy.
Проблема:
Когда я компилирую и обучаю модель, я сталкиваюсь с ошибкой InvalidArgumentError во время вызова model.fit(), особенно внутри расчет tf.keras.metrics.AUC. Обратная трассировка постоянно указывает на несоответствие формы внутреннего тензора:

Код: Выделить всё

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]
Что я пробовал:
  • Прямой tf.keras.metrics.AUC: Первоначально я использовал tf.keras.metrics.AUC напрямую. Это вызвало ошибку InvalidArgumentError.
  • Код: Выделить всё

    sparse_labels=True
    (Попытка):[/b] Я попытался передать sparse_labels=True в tf.keras.metrics.AUC, но это привело к ошибке типа: AUC.__init__() получил неожиданный аргумент ключевого слова 'sparse_labels', указывающий, что этот аргумент либо устарел, либо не поддерживается в моей версии TF.
  • Пользовательский Метрика AUC: для явной обработки разреженных меток и вывода softmax я реализовал класс CustomAUC. Эта пользовательская метрика наследуется от tf.keras.metrics.AUC и в своем методе update_state извлекает вероятность положительного класса (индекс 1) из выходных данных softmax модели () перед передачей его в update_state родительского класса AUC.
Несмотря на использование этой метрики CustomAUC, ошибка InvalidArgumentError сохраняется во время обучения, что позволяет предположить, что может существовать более глубокая проблема с тем, как tf.keras.metrics.AUC взаимодействует с выходными данными Sequence и разреженными метками в этом контексте.

Соответствующие фрагменты кода:
Вот как мой генератор данных создает метки (примечание: размер пакета обычно равен 4 в моих настройках для этих генераторов):

Код: Выделить всё

# 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
Это реализация моей метрики CustomAUC. Ключевая логика находится в методе update_state, где y_pred[:, 1] используется для получения положительной вероятности класса:

Код: Выделить всё

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)
И, наконец, как модель компилируется с использованием sparse_categorical_crossentropy и моей метрики CustomAUC:

Код: Выделить всё

model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4),
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy', CustomAUC(name='auc')] # Using the custom AUC
)
Почему tf.keras.metrics.AUC (даже специальная версия, извлекающая положительную вероятность класса) может давать сбой с InvalidArgumentError при использовании с sparse_categorical_crossentropy и Sequence таким образом?

Подробнее здесь: https://stackoverflow.com/questions/798 ... bels-categ
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»