Почему графики точности и потерь моей бинарной модели Keras не являются гладкими?

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

Я создаю бинарную модель и использую TensorBoard для визуализации графиков точности и потерь. Однако я заметил, что графики точности и потерь моей модели не гладкие. Почему это происходит?

Вот графики точности и потерь моей модели:

Точность:

Точность

Потери:

Потери

Как вы можете видеть, графики выше не гладкие. Вот мой код для отладки:

import keras
from keras import models, layers, regularizers, optimizers, callbacks

def create_model(input_shape):
    model = models.Sequential([
        layers.Input(shape=input_shape),
        
        layers.Dense(256, kernel_regularizer=regularizers.l2(0.002)),
        layers.BatchNormalization(),
        layers.Activation("relu"),
        layers.Dropout(0.4),
        
        layers.Dense(512, kernel_regularizer=regularizers.l2(0.002)),
        layers.BatchNormalization(),
        layers.Activation("relu"),
        layers.Dropout(0.4),
        
        layers.Dense(512, kernel_regularizer=regularizers.l2(0.002)),
        layers.BatchNormalization(),
        layers.Activation("relu"),
        layers.Dropout(0.4),
        
        layers.Dense(256, kernel_regularizer=regularizers.l2(0.002)),
        layers.BatchNormalization(),
        layers.Activation("relu"),
        layers.Dropout(0.4),
        
        layers.Dense(128, kernel_regularizer=regularizers.l2(0.002)),
        layers.BatchNormalization(),
        layers.Activation("relu"),
        layers.Dropout(0.4),
        
        layers.Dense(1, activation="sigmoid")
    ])
    return model

input_shape = x_train.shape[1:]
model = create_model(input_shape)

optimizer = optimizers.AdamW(learning_rate=0.001)

model.compile(
    optimizer=optimizer,
    loss="binary_crossentropy",
    metrics=["accuracy", keras.metrics.AUC()]
)

reduce_lr = callbacks.ReduceLROnPlateau(monitor="val_loss", factor=0.2, patience=3, min_lr=1e-6, verbose=1)
model_checkpoint = callbacks.ModelCheckpoint("best_model.keras", monitor="val_loss", mode="min", save_best_only=True, verbose=1)
tensorboard = callbacks.TensorBoard(log_dir="./logs")

data_augmentation = keras.Sequential([
    layers.GaussianNoise(0.1),
])

history = model.fit(
    data_augmentation(x_train),
    y_train,
    batch_size=64,
    epochs=500,
    validation_split=0.2,
    callbacks=[reduce_lr, model_checkpoint, tensorboard],
    class_weight={0: 1, 1: 1},
    shuffle=True
)

test_loss, test_accuracy, test_auc = model.evaluate(x_test, y_test)
print(f"Потери на тесте: {test_loss:.4f}")
print(f"Точность на тесте: {test_accuracy:.4f}")
print(f"AUC на тесте: {test_auc:.4f}")

Обратите внимание, что форма x_train равна (121, 1), а форма y_train равна (121,).

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

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

Причины нерегулярности графиков точности и потерь

  1. Маленький размер данных: У вас указано, что форма x_train равна (121, 1), что означает, что у вас всего 121 пример для обучения. С таким малым объемом данных модели могут резко изменять своей поведение на каждой эпохе, особенно если они не обладают достаточной вместимостью для обобщения на таких небольших выборках. Это может приводить к резким скачкам в значениях потерь и точности.

  2. Шум в данных: Если ваши данные содержат много шума или выбросов, это может также вызвать нестабильность в обучении. Шум может влиять на результат работы модели, и каждая итерация может демонстрировать различные результаты, в зависимости от пакета данных, который она обрабатывает (особенно в случае использования механизмов увеличения данных).

  3. Использование Dropout: Вы используете слой Dropout со значением 0.4. Это повышает вероятность того, что на каждой итерации будет убрано 40% нейронов, что создает дополнительные вызовы для обучения модели. Высокая дропаута может привести к колебаниям в графиках потерь и точности, так как они могут каждый раз обрабатывать разные наборы нейронов.

  4. Размер мини-бачей: Вы используете batch_size=64. При таком размере, и с учетом небольшого размера данных, это может приводить к тому, что некоторые мини-батчи имеют только несколько примеров, вызывая дополнительные колебания в обучении. Попробуйте уменьшить размер батча.

  5. Адаптивный оптимизатор: Вы используете оптимизатор AdamW, который может вести к нестабильным обновлениям весов, особенно при неправильном выборе параметров. Попробуйте поиграть с настройками скорости обучения (learning_rate). Возможно, стоит попробовать другой оптимизатор, например, SGD с моментумом.

  6. Отслеживание метрик: Убедитесь, что вы правильно отслеживаете метрики. Использование нескольких метрик (например, AUC) может не всегда давать корректную картину, и обычно стоит либо отслеживать основную метрику (в вашем случае это может быть accuracy), либо следить за loss.

Как улучшить графики

  1. Увеличьте объем данных: Если возможно, постарайтесь увеличить набор данных, чтобы модель могла более равномерно обучиться и обобщить.

  2. Сглаживание графиков: Вы можете использовать методы сглаживания, чтобы визуализировать ваши графики. Однако это лишь визуальный эффект и не устранит проблемы в самом процессе обучения.

  3. Измените параметры модели: Уменьшите количество Dropout или попробуйте убрать его на первых этапах обучения. Также поэкспериментируйте с уменьшением сложности модели.

  4. Измените настройки оптимизатора: Попробуйте адаптировать размер шага или выбрать другой алгоритм оптимизации, который мог бы быть более стабильным.

  5. Доработайте увеличение данных: Убедитесь, что используемая вами схема увеличения данных действительно добавляет полезные трансформации, а не просто добавляет шум.

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

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

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