Код: Выделить всё
TensorFlow version: 2.19.0). Архитектура моей модели представляет собой мультимодальную установку с двумя входными ветвями (сканирование КТ и ПЭТ), а ее последним слоем является слой DenseМои данные передаются в модель с помощью специального генератора данных 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.
- (Попытка):[/b] Я попытался передать sparse_labels=True в tf.keras.metrics.AUC, но это привело к ошибке типа: AUC.__init__() получил неожиданный аргумент ключевого слова 'sparse_labels', указывающий, что этот аргумент либо устарел, либо не поддерживается в моей версии TF.
Код: Выделить всё
sparse_labels=True - Пользовательский Метрика AUC: для явной обработки разреженных меток и вывода softmax я реализовал класс CustomAUC. Эта пользовательская метрика наследуется от tf.keras.metrics.AUC и в своем методе update_state извлекает вероятность положительного класса (индекс 1) из выходных данных softmax модели () перед передачей его в update_state родительского класса AUC.
Код: Выделить всё
y_pred
Соответствующие фрагменты кода:
Вот как мой генератор данных создает метки (примечание: размер пакета обычно равен 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
Код: Выделить всё
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)
Код: Выделить всё
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4),
loss='sparse_categorical_crossentropy',
metrics=['accuracy', CustomAUC(name='auc')] # Using the custom AUC
)
Подробнее здесь: https://stackoverflow.com/questions/798 ... bels-categ
Мобильная версия