Улучшение потерь валидации и точности для 3D CNN

Вопрос или проблема

Я использовал архитектуру 3D CNN для обнаружения наличия определенного промотора (MGMT) с использованием FLAIR сканов мозга. (64 среза на пациента). Выход должен быть двоичным (0/1).

Я правильно выполнил предварительную обработку и использовал стратификацию после разделения набора данных “train” на обучающую и валидационную выборки (в соотношении 80-20). Инициализация модели и ядра обучения выглядят так:

def get_model(width=128, height=128, depth=64):
"""Создание модели 3D сверточной нейронной сети."""

inputs = keras.Input((width, height, depth, 1))

x = layers.Conv3D(filters=64, kernel_size=3, activation="relu")(inputs)
x = layers.MaxPool3D(pool_size=2)(x)
x = layers.BatchNormalization()(x)

x = layers.Conv3D(filters=64, kernel_size=3, activation="relu")(x)
x = layers.MaxPool3D(pool_size=2)(x)
x = layers.BatchNormalization()(x)

x = layers.Conv3D(filters=128, kernel_size=3, activation="relu")(x)
x = layers.MaxPool3D(pool_size=2)(x)
x = layers.BatchNormalization()(x)

x = layers.Conv3D(filters=256, kernel_size=3, activation="relu")(x)
x = layers.MaxPool3D(pool_size=2)(x)
x = layers.BatchNormalization()(x)

x = layers.GlobalAveragePooling3D()(x)
x = layers.Dense(units=512, activation="relu")(x)
x = layers.Dropout(0.3)(x)

outputs = layers.Dense(units=1, activation="sigmoid")(x)

# Определение модели.
model = keras.Model(inputs, outputs, name="3dcnn")
return model


# Построение модели.
model = get_model(width=128, height=128, depth=64)
model.summary()

Компиляция модели:

initial_learning_rate = 0.0001
lr_schedule = keras.optimizers.schedules.ExponentialDecay(
    initial_learning_rate, decay_steps=100000, decay_rate=0.96, staircase=True
)
model.compile(
    loss="binary_crossentropy",
    optimizer=keras.optimizers.Adam(learning_rate=lr_schedule),
    metrics=["acc"],
)

# Определение обратных вызовов.
checkpoint_cb = keras.callbacks.ModelCheckpoint(
    "Brain_3d_classification.h5", save_best_only=True, monitor="val_acc", 
                             mode="max", verbose=1
)
early_stopping_cb = keras.callbacks.EarlyStopping(monitor="val_acc", patience=20, mode="max", verbose=1,
                           restore_best_weights=True)

# Обучение модели с валидацией в конце каждой эпохи
epochs = 60
model.fit(
    train_dataset,
    validation_data=valid_dataset,
    epochs=epochs,
    shuffle=True,
    verbose=2,
    callbacks=[checkpoint_cb, early_stopping_cb],
)

Это мой первый опыт работы с 3D CNN, и я использовал эту страницу Keras для формата:https://keras.io/examples/vision/3D_image_classification/

Максимальная точность валидации в моем случае составила около 54%. Я попробовал уменьшить начальную скорость обучения, и при 0.00001 я достиг максимума 66.7%. Для скоростей обучения 0.00005 и 0.00002 я получил максимальную точность около 60 и 62%.

Графики точности по эпохам для скоростей обучения 0.0001, 0.00005, 0.00002 и 0.00001:

0.0001
enter image description here
enter image description here
enter image description here

Кажется, что уменьшение начальной скорости обучения положительно сказывается на точности, хотя она все еще очень низкая.

Какие еще параметры я могу настроить для ожидания лучшей точности? И можно ли просто продолжать уменьшать начальную скорость обучения, пока мы не достигнем целевой точности?

Я знаю, что это довольно общий вопрос, но я довольно запутался в том, как мы должны подходить к увеличению точности в случае CNN (тем более 3D), когда кажется, что происходит очень много всего. Должен ли я изменить что-то в своих инициализациях? Добавить больше слоев? Или изменить параметры? Уменьшить или увеличить их? При таком количестве всего я не думаю, что пробовать каждую комбинацию и продолжать повторять процесс обучения – это эффективная идея…

Полный ноутбук (включая шаги предварительной обработки): https://www.kaggle.com/shivamee682003/3d-image-preprocessing-17cd03/edit

Добавление большего количества FC слоев также полезно для небольших данных и небольших размеров изображений, например, после слоя Flatten, как показано ниже:

flatten_layer = layers.Flatten()(x)

dense_layer1 = layers.Dense(units=512, activation='relu')(flatten_layer)
dense_layer1 = layers.Dropout(0.4)(dense_layer1)


dense_layer2 = layers.Dense(units=512, activation='relu')(dense_layer1)
dense_layer2 = layers.Dropout(0.4)(dense_layer2)

dense_layer3 = layers.Dense(units=256, activation='relu')(dense_layer2)
dense_layer3 = layers.Dropout(0.4)(dense_layer3)

dense_layer4 = layers.Dense(units=128, activation='relu')(dense_layer3)
dense_layer4 = layers.Dropout(0.4)(dense_layer4)

Вы можете поиграть со скоростью dropout и количеством нейронов в слое Dense, так как нет общего правила для них. Следующая статья может быть полезной

https://arxiv.org/pdf/1902.02771.pdf#:~:text=The%20output%20(FC)%20layer%20has,%2C%20and%20CRCHistoPhenotypes%20datasets%2C%20respectively.

.

Ответ или решение

Чтобы улучшить точность и уменьшить валидационные потери в модели 3D CNN для обнаружения промотора MGMT на FLAIR-сканах мозга, необходимо учитывать несколько ключевых аспектов и внести определенные изменения в конфигурацию модели и процесс обучения. Рассмотрим несколько стратегий, которые помогут повысить эффективность вашей сети.

F — Focus on the Audience (Фокус на аудиторию)

Ваш проект ориентирован на задачи медицинской диагностики, поэтому надежность и точность модели чрезвычайно важны. Вы стремитесь к максимизации точности и снижению потерь, и это требует поиска сбалансированных параметров.

O — Offer (Предложение)

  1. Оптимизация архитектуры:

    • Увеличение глубины: Вы можете добавить дополнительные слои Conv3D с меньшим количеством фильтров, чтобы извлечь более сложные признаки.
    • Изменение плотности: Рассмотрите увеличение или уменьшение количества нейронов в Dense слоях. Это поможет модели лучше обобщать данные.
  2. Регуляризация:

    • Увеличение dropout: Попробуйте варьировать коэффициент отсечения (dropout) в пределах от 0.3 до 0.5, чтобы избежать перенапряжения модели.
  3. Предобработка данных:

    • Аугментация данных: Увеличивайте выборку путем аугментации изображений, что может помочь избежать перенапряжения и улучшить генерализацию.
    • Нормализация: Убедитесь, что данные нормализованы, чтобы ускорить обучение.
  4. Изменение параметров обучения:

    • Адаптивное изменение скорости обучения: Вместо постоянного уменьшения скорости, используйте адаптивные алгоритмы, такие как ‘ReduceLROnPlateau’, которые реагируют на стабилизацию потерь.

R — Reach Out (Призыв к действию)

Чтобы протестировать эти изменения, итерационно корректируйте модель и наблюдайте за изменениями в производительности. Внедрение новых методов может занять время, но приведет к более устойчивым улучшениям.

E — Engage (Вовлечение)

Поделитесь результатами и полученными данными с коллегами и экспертами в области медицинских изображений. Это поможет получить обратную связь и новые идеи для оптимизации.

S — Share (Делиться)

Поделитесь своим проектом и процессом на платформах вроде Kaggle или профессиональных форумах. Это не только обеспечит вас обратной связью, но и укрепит ваше положение как эксперта в области применения глубокого обучения в медицине.

T — Transform (Трансформация)

Изменив подход и внедрив предложенные стратегии, вы не только повысите точность, но и сделаете значительный шаг в применении ИИ для медицинских целей, подтверждая высокую профессиональную репутацию.

Таким образом, стратегический подход к изменению архитектуры и процесса обучения не только улучшит метрики модели, но и усилит вашу экспертизу в применении глубокого обучения для анализа медицинских изображений.

Оцените материал
Добавить комментарий

Капча загружается...