Вопрос или проблема
Я создаю бинарную модель и использую 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 не являются гладкими, является распространенной проблемой, с которой сталкиваются многие разработчики. Давайте разберем несколько факторов, которые могут способствовать этой ситуации.
Причины нерегулярности графиков точности и потерь
-
Маленький размер данных: У вас указано, что форма
x_train
равна(121, 1)
, что означает, что у вас всего 121 пример для обучения. С таким малым объемом данных модели могут резко изменять своей поведение на каждой эпохе, особенно если они не обладают достаточной вместимостью для обобщения на таких небольших выборках. Это может приводить к резким скачкам в значениях потерь и точности. -
Шум в данных: Если ваши данные содержат много шума или выбросов, это может также вызвать нестабильность в обучении. Шум может влиять на результат работы модели, и каждая итерация может демонстрировать различные результаты, в зависимости от пакета данных, который она обрабатывает (особенно в случае использования механизмов увеличения данных).
-
Использование
Dropout
: Вы используете слойDropout
со значением 0.4. Это повышает вероятность того, что на каждой итерации будет убрано 40% нейронов, что создает дополнительные вызовы для обучения модели. Высокая дропаута может привести к колебаниям в графиках потерь и точности, так как они могут каждый раз обрабатывать разные наборы нейронов. -
Размер мини-бачей: Вы используете
batch_size=64
. При таком размере, и с учетом небольшого размера данных, это может приводить к тому, что некоторые мини-батчи имеют только несколько примеров, вызывая дополнительные колебания в обучении. Попробуйте уменьшить размер батча. -
Адаптивный оптимизатор: Вы используете оптимизатор
AdamW
, который может вести к нестабильным обновлениям весов, особенно при неправильном выборе параметров. Попробуйте поиграть с настройками скорости обучения (learning_rate
). Возможно, стоит попробовать другой оптимизатор, например,SGD
с моментумом. -
Отслеживание метрик: Убедитесь, что вы правильно отслеживаете метрики. Использование нескольких метрик (например, AUC) может не всегда давать корректную картину, и обычно стоит либо отслеживать основную метрику (в вашем случае это может быть
accuracy
), либо следить заloss
.
Как улучшить графики
-
Увеличьте объем данных: Если возможно, постарайтесь увеличить набор данных, чтобы модель могла более равномерно обучиться и обобщить.
-
Сглаживание графиков: Вы можете использовать методы сглаживания, чтобы визуализировать ваши графики. Однако это лишь визуальный эффект и не устранит проблемы в самом процессе обучения.
-
Измените параметры модели: Уменьшите количество
Dropout
или попробуйте убрать его на первых этапах обучения. Также поэкспериментируйте с уменьшением сложности модели. -
Измените настройки оптимизатора: Попробуйте адаптировать размер шага или выбрать другой алгоритм оптимизации, который мог бы быть более стабильным.
-
Доработайте увеличение данных: Убедитесь, что используемая вами схема увеличения данных действительно добавляет полезные трансформации, а не просто добавляет шум.
В целом, решение вашей проблемы может потребовать некоторого экспериментирования с архитектурой модели, параметрами обучения и обработкой данных. Удачи в дальнейших экспериментах!