Почему графики точности и потерь моей бинарной модели 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: {test_loss:.4f}")
print(f"Test accuracy: {test_accuracy:.4f}")
print(f"Test AUC: {test_auc:.4f}")

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

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

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

1. Размер обучающей выборки

Ваша обучающая выборка имеет размер (121, 1), что довольно мало для обучения сложной модели с несколькими Dense-слоями. Небольшое количество данных может привести к высокой вариативности в оценках производительности модели, что отражается на графиках точности и потерь.

Рекомендация: Попробуйте увеличить размер обучающей выборки, если это возможно. Для небольших наборов данных также можно использовать методы увеличения данных (data augmentation), чтобы обогатить информацию, доступную для обучения модели.

2. Использование размера батча

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

Рекомендация: Уменьшите размер батча (например, до 16 или 32), чтобы получить более частые обновления параметров модели и более плавные изменения на графиках.

3. Случайное начальное состояние

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

Рекомендация: Установите фиксированное значение для случайного генератора с помощью numpy.random.seed() и tensorflow.random.set_seed(), чтобы получить воспроизводимые результаты.

4. Переобучение и недообучение

Слишком сложная модель для небольшого объема данных может привести к переобучению, когда модель слишком точно подстраивается под обучающий набор данных. Это также может выражаться в «шумных» графиках.

Рекомендация: Попробуйте уменьшить количество нейронов в слоях или количество слоев, а также внимательно следите за регуляризацией. Ваши текущие настройки L2-регуляризации могут потребовать малой настройки или изменения.

5. Аугментация данных

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

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

6. Неправильная метрика или неправильная периодичность записей

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

Рекомендация: Убедитесь, что вы правильно выводите и сохраняете показатели, и рассмотрите возможность использования model.fit() с различной частотой событий (например, записывая информацию каждые N эпох).

Заключение

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

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

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