Бинарная классификация с использованием RNN не превышает 50% точности.

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

Я пытаюсь выяснить причину, по которой моя сеть RNN не может превысить 50% для двоичной классификации. Мои входные данные имеют форму:

X.shape
- TensorShape([9585, 25, 2])

Мои метки представляют собой вектор с единым измерением с значениями 1.0 и 0.0:

y
- <tf.Tensor: shape=(9585,), dtype=float32, numpy=array([1., 0., 1., ..., 0., 0., 1.], dtype=float32)>

Я создал класс классификации следующим образом:

batch_size = 4 # гиперпараметр
max_seqlen = 25 # второе измерение (время) в данных, первое - количество точек данных
features = 2 # 2 признака на временную метку

class Model(tf.keras.Model):
    def __init__(self, max_seqlen, **kwargs):
        super(Model, self).__init__(**kwargs)
        self.bilstm = tf.keras.layers.Bidirectional(
            tf.keras.layers.LSTM(128, return_sequences=False, input_shape=(max_seqlen, features))
        )
        self.dense = tf.keras.layers.Dense(50, activation="relu") # нейронная сеть с нелинейностью relu
        self.out = tf.keras.layers.Dense(1, activation="sigmoid") # для окончательного бинарного предсказания
    def call(self, x):
        x = self.bilstm(x)
        x = self.dense(x)
        x = self.out(x)
        return x
model = Model(max_seqlen)
model.build(input_shape=(batch_size, max_seqlen, features))
model.summary()

Я подготавливаю набор данных и запускаю обучение и валидацию следующим образом:

dataset = tf.data.Dataset.from_tensor_slices((X, y))
dataset = dataset.shuffle(10000)
n = len(y)
test_size = n // 8
val_size = (n - test_size) // 10

test_dataset = dataset.take(test_size)
val_dataset = dataset.skip(test_size).take(val_size)
train_dataset = dataset.skip(test_size + val_size)
train_dataset = train_dataset.batch(batch_size)
val_dataset = val_dataset.batch(batch_size)
test_dataset = test_dataset.batch(batch_size)

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

# обучение
data_dir = "./data"
logs_dir = os.path.join("./logs")
best_model_file = os.path.join(data_dir, "best_model.h5")

checkpoint = tf.keras.callbacks.ModelCheckpoint(best_model_file,
    save_weights_only=True,
    save_best_only=True)
tensorboard = tf.keras.callbacks.TensorBoard(log_dir=logs_dir)
num_epochs = 10
history = model.fit(train_dataset, epochs=num_epochs,
    validation_data=val_dataset,
    callbacks=[checkpoint, tensorboard])

Во время эпох точность не улучшается более чем на 50%. Есть ли что-то не так с тем, что я делаю? Я также пробовал нормализовать свои данные.

Чтобы разделить ваш набор данных, попробуйте это:

train_ds = dataset.take(train_size)    
val_ds = dataset.skip(train_size).take(val_size)
test_ds = dataset.skip(train_size).skip(val_size)

Нашел проблему. y были некорректными относительно соответствующих X.

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

Причины низкой точности бинарной классификации с использованием RNN в TensorFlow

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

1. Качество и соответствие данных

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

Рекомендации:

  • Убедитесь, что данные предобработаны и очищены. Проверьте наличие пропусков, выбросов и неправильных значений.
  • Убедитесь в том, что размерность y соответствует размерности X. В вашем случае это должно быть согласовано так: при наличии 9585 последовательностей длиной 25 и двумя признаками у вас должно быть 9585 меток.

2. Архитектура модели

Ваше использование двунаправленного LSTM может быть оправдано. Однако стоит обратить внимание на количество нейронов и структуру. Возможно, 128 единиц в LSTM недостаточно для вашей задачи. Размер последовательности и количество признаков также могут влиять на производительность.

Рекомендации:

  • Рассмотрите возможность увеличения числа нейронов в слое LSTM или добавления дополнительных слоев (например, несколько LSTM-слоев).
  • Попробуйте другие архитектуры, такие как GRU или даже комбинированные модели, включающие CNN и RNN.

3. Параметры обучения и настройка гиперпараметров

Ваш выбор значения batch_size, функции активации и оптимизатора может оказать значительное влияние на обучение модели.

Рекомендации:

  • Подберите различные значения batch_size. Иногда большие размеры пакетов могут привести к тому, что модель не обучается должным образом.
  • Рассмотрите изменение значений параметров обучения, таких как скорость обучения (learning rate), которую можно настроить с помощью подходящих методов, например, ReduceLROnPlateau.
  • Попробуйте различные функции активации в плотном слое, таких как Leaky ReLU или ELU.

4. Проблемы с переобучением или недообучением

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

Рекомендации:

  • Используйте методы регуляризации, такие как Dropout, чтобы предотвратить переобучение.
  • Увеличьте количество эпох для обучения модели и наблюдайте за поведением обучающей и валидационной точности.

5. Обработка и нормализация данных

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

Рекомендации:

  • Убедитесь, что данные нормализованы таким образом, чтобы все признаки находились в одном и том же диапазоне (например, от 0 до 1 или с использованием стандартного отклонения).

Заключение

Точность бинарной классификации, остающаяся на уровне 50%, обычно указывает на проблемы как с данными, так и с моделью. Корректируя указанные выше аспекты, вы сможете значительно улучшить результаты. Начните с тщательной проверки ваших данных на корректность и соответствие, затем переходите к изучению различных архитектур и гиперпараметров вашей модели.

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

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

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