Вопрос или проблема
Я использовал архитектуру 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:
Кажется, что уменьшение начальной скорости обучения положительно сказывается на точности, хотя она все еще очень низкая.
Какие еще параметры я могу настроить для ожидания лучшей точности? И можно ли просто продолжать уменьшать начальную скорость обучения, пока мы не достигнем целевой точности?
Я знаю, что это довольно общий вопрос, но я довольно запутался в том, как мы должны подходить к увеличению точности в случае 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, так как нет общего правила для них. Следующая статья может быть полезной
.
Ответ или решение
Чтобы улучшить точность и уменьшить валидационные потери в модели 3D CNN для обнаружения промотора MGMT на FLAIR-сканах мозга, необходимо учитывать несколько ключевых аспектов и внести определенные изменения в конфигурацию модели и процесс обучения. Рассмотрим несколько стратегий, которые помогут повысить эффективность вашей сети.
F — Focus on the Audience (Фокус на аудиторию)
Ваш проект ориентирован на задачи медицинской диагностики, поэтому надежность и точность модели чрезвычайно важны. Вы стремитесь к максимизации точности и снижению потерь, и это требует поиска сбалансированных параметров.
O — Offer (Предложение)
-
Оптимизация архитектуры:
- Увеличение глубины: Вы можете добавить дополнительные слои Conv3D с меньшим количеством фильтров, чтобы извлечь более сложные признаки.
- Изменение плотности: Рассмотрите увеличение или уменьшение количества нейронов в Dense слоях. Это поможет модели лучше обобщать данные.
-
Регуляризация:
- Увеличение dropout: Попробуйте варьировать коэффициент отсечения (dropout) в пределах от 0.3 до 0.5, чтобы избежать перенапряжения модели.
-
Предобработка данных:
- Аугментация данных: Увеличивайте выборку путем аугментации изображений, что может помочь избежать перенапряжения и улучшить генерализацию.
- Нормализация: Убедитесь, что данные нормализованы, чтобы ускорить обучение.
-
Изменение параметров обучения:
- Адаптивное изменение скорости обучения: Вместо постоянного уменьшения скорости, используйте адаптивные алгоритмы, такие как ‘ReduceLROnPlateau’, которые реагируют на стабилизацию потерь.
R — Reach Out (Призыв к действию)
Чтобы протестировать эти изменения, итерационно корректируйте модель и наблюдайте за изменениями в производительности. Внедрение новых методов может занять время, но приведет к более устойчивым улучшениям.
E — Engage (Вовлечение)
Поделитесь результатами и полученными данными с коллегами и экспертами в области медицинских изображений. Это поможет получить обратную связь и новые идеи для оптимизации.
S — Share (Делиться)
Поделитесь своим проектом и процессом на платформах вроде Kaggle или профессиональных форумах. Это не только обеспечит вас обратной связью, но и укрепит ваше положение как эксперта в области применения глубокого обучения в медицине.
T — Transform (Трансформация)
Изменив подход и внедрив предложенные стратегии, вы не только повысите точность, но и сделаете значительный шаг в применении ИИ для медицинских целей, подтверждая высокую профессиональную репутацию.
Таким образом, стратегический подход к изменению архитектуры и процесса обучения не только улучшит метрики модели, но и усилит вашу экспертизу в применении глубокого обучения для анализа медицинских изображений.