Модель CNN недостаточно обучается. Точность остается на одном уровне.

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

Я работаю над моделью глубокого обучения, которая поможет мне предсказывать глубокие фальшивые голоса. Для предварительной обработки данных я сделал все согласно литературе, которая уже была опубликована. Но проблема, с которой я сталкиваюсь, заключается в том, что когда я хочу обучить модель, модель CNN начинает с точности около 51% и заканчивает примерно на 54%. Я подаю изображения (в основном массивы) спектрограммам в модель. Я не знаю, правильны ли мои основные принципы. Я хочу улучшить точность через обучение.

Размер моего набора данных составляет 1000 аудиофайлов, если понадобится, я могу увеличить его до 4500. Но сначала моя модель должна показать обещание обучения, постоянство точности с самого начала до конца говорит мне о другом.

import tensorflow as tf
from tensorflow.keras import layers, models
import numpy as np


def create_cnn_model(input_shape):
    model = models.Sequential()

   
    model.add(layers.InputLayer(input_shape=input_shape))

    
    model.add(layers.Conv2D(32, (3, 3), activation='relu', padding='same'))
    model.add(layers.Conv2D(32, (3, 3), activation='relu', padding='same'))
    model.add(layers.MaxPooling2D((2, 2)))

    
    model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same'))
    model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same'))
    model.add(layers.MaxPooling2D((2, 2)))

    
    model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same'))
    model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same'))
    model.add(layers.MaxPooling2D((2, 2)))

    
    model.add(layers.Conv2D(256, (3, 3), activation='relu', padding='same'))
    model.add(layers.Conv2D(256, (3, 3), activation='relu', padding='same'))
    model.add(layers.MaxPooling2D((2, 2)))

    
    model.add(layers.Flatten())
    model.add(layers.Dense(512, activation='relu'))
    model.add(layers.Dropout(0.5))
    model.add(layers.Dense(256, activation='relu'))
    model.add(layers.Dropout(0.5))
    model.add(layers.Dense(128, activation='relu'))


    model.add(layers.Dense(1, activation='sigmoid'))

    return model


input_shape = (X_train.shape[1], X_train.shape[2], 1)  
cnn_model = create_cnn_model(input_shape)

cnn_model.compile(optimizer="adam",
                  loss="binary_crossentropy",
                  metrics=['accuracy'])


history = cnn_model.fit(X_train, y_train, epochs=50, batch_size=32,     validation_data=(X_val, y_val))

test_loss, test_acc = cnn_model.evaluate(X_val, y_val)
print(f"Тестовая точность: {test_acc * 100:.2f}%")

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

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

1. Размерность данных и предобработка

Убедитесь, что ваши входные данные корректно подготовлены. Возможно, спектрограммы не представлены в нужном формате или масштабе. Обратите внимание на следующее:

  • Нормализация данных: Убедитесь, что входные данные (спектрограммы) нормализованы. Например, вы можете применить стандартное отклонение и среднее значение или просто масштабировать значения в диапазон [0, 1].
  • Обработка данных: Если возможно, увеличьте разнообразие вашего набора данных. Каждый класс должен быть представлен в достаточно большом количестве и разнообразии.

2. Размер и качество выборки

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

  • Увеличение размера выборки: Увеличьте размер вашего набора данных до 4500 примеров или больше. Это даст модели больше информации для обучения.
  • Аугментация данных: Применяйте техники аугментации для ваших аудиофайлов или изображений спектрограмм. Вы можете изменять высоту тона, добавлять шум, изменять скорость воспроизведения и т.д.

3. Архитектура модели и гиперпараметры

Ваша текущая архитектура может быть переобученной или недообученной:

  • Изменение архитектуры: Попробуйте изменить количество слоев или фильтров, а также количество параметров в полносвязных слоях. Возможно, стоит уменьшить размерность модели, если она слишком сложная для вашего объема данных.
  • Снижение или увеличение скорости обучения: Попробуйте использовать различные значения скорости обучения с оптимизатором Adam. Возможно, стоит поэкспериментировать с другими оптимизаторами (например, SGD или RMSprop).

4. Настройки обучения

Рассмотрите возможность изменения параметров обучения:

  • Увеличение количества эпох: Возможно, вашей модели просто не хватает количества эпох для тренировки. Попробуйте увеличить их до 100 или более.
  • Использование ранней остановки: Для избежания переобучения можно воспользоваться технологией ранней остановки (early stopping), чтобы контролировать качество обучения.

5. Проверка на переобучение

Проверьте, не сталкиваетесь ли вы с проблемой переобучения. Это происходит, когда модель запоминает данные, а не учится их обобщать. Если у вас хороший результат на тренировочном наборе, но не на валидационном:

  • Увеличьте уровень регуляризации, добавив слой Dropout или L2-регуляризацию.

Пример доработанной модели

Вот некоторые изменения, которые вы можете внести в вашу исходную модель:

from tensorflow.keras import regularizers

def create_cnn_model(input_shape):
    model = models.Sequential()
    model.add(layers.InputLayer(input_shape=input_shape))

    # Основные слои
    model.add(layers.Conv2D(32, (3, 3), activation='relu', padding='same'))
    model.add(layers.MaxPooling2D((2, 2)))

    model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same'))
    model.add(layers.MaxPooling2D((2, 2)))

    model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same'))
    model.add(layers.MaxPooling2D((2, 2)))

    model.add(layers.Flatten())
    model.add(layers.Dense(256, activation='relu', kernel_regularizer=regularizers.l2(0.001)))
    model.add(layers.Dropout(0.5))
    model.add(layers.Dense(1, activation='sigmoid'))

    return model

Заключение

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

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

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