Улучшение учебника по временным рядами TensorFlow пошло не так

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

Я следил за этим учебным руководством по временным рядами для Tensorflow…

https://www.tensorflow.org/tutorials/structured_data/time_series

И всё шло хорошо и казалось, что всё работает нормально. Я заменил его своим собственным набором данных (около 1.1 миллиона записей с 4 признаками), и он тоже, казалось, хорошо работал, но память становилась ОЧЕНЬ ограниченной, поэтому я подумал, что попробую реализовать улучшение, упомянутое внизу, которое говорило…

Кроме того, вы также можете написать генератор, который будет выдавать данные (вместо функции uni/multivariate_data), что будет более эффективно с точки зрения памяти. Вы также можете ознакомиться с этим руководством по окнам временных рядов и использовать его в этом учебном руководстве.

https://www.tensorflow.org/guide/data#time_series_windowing

Казалось, что я могу использовать TensorFlow для создания окон, которые, как я предположил, будут выполняться динамически, поэтому не будет использовано много памяти. После чтения я пришел к следующему коду, чтобы попробовать заменить функцию multivariate_data (функции заимствованы из учебного руководства, хотя я изменил dense_1_step, чтобы вернуть один набор признаков меток вместо окна…

def make_window_dataset(ds, window_size=5, shift=1, stride=1):
  windows = ds.window(window_size, shift=shift, stride=stride)

  def sub_to_batch(sub):
    return sub.batch(window_size, drop_remainder=True)

  windows = windows.flat_map(sub_to_batch)
  return windows

def dense_1_step(batch):
  # Сдвиньте признаки и метки на один шаг относительно друг друга.
  return batch[:-1], batch[-1:]

# получить обучающие образцы (признаки и метки)
train_ds = make_window_dataset(tf.data.Dataset.from_tensor_slices(dataset[:TRAIN_SPLIT]), window_size=past_history+1, shift = 1, stride=1)
dense_labels_train_ds = train_ds.map(dense_1_step)

# получить валидационные образцы (признаки и метки)
val_ds = make_window_dataset(tf.data.Dataset.from_tensor_slices(dataset[TRAIN_SPLIT:]), window_size=past_history+1, shift = 1, stride=1)
dense_labels_val_ds = val_ds.map(dense_1_step)

# группировать и перемешивать обучающие данные
train_data_single = dense_labels_train_ds.cache().shuffle(BUFFER_SIZE).batch(BATCH_SIZE).repeat()
val_data_single = dense_labels_val_ds.batch(BATCH_SIZE).repeat()

Но по какой-то причине всё пошло не так по следующим причинам…

  1. Потеря на обучении и валидации теперь совершенно не похожи, и, честно говоря, я не думаю, что сеть даже учится должным образом.
  2. Использование памяти кажется гораздо лучше, ПОКА вы не выполните fit(), и тогда она просто взрывается более-менее так же.
  3. Я получаю предупреждение ‘Множества в настоящее время не считаются последовательностями, но это может измениться в будущем, поэтому подумайте о том, чтобы избежать их использования.’

Я уверен, что я что-то сломал здесь, но мне кажется, что это делает то, что должно делать. Я всё ещё нахожусь на крутом пути обучения, но если кто-то с большим опытом мог бы указать мне верное направление, я был бы очень благодарен.

Спасибо.

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

def dense_1_step(batch):
  # Сдвиньте признаки и метки на один шаг относительно друг друга.
  return batch[:-1], batch[-1:,1][0] # взять только второй признак

Чтобы сделать это аналогично выходным данным функции multivariate_data.

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

Усовершенствование туториала по временным рядам TensorFlow: решение проблемы

В ходе работы с туториалом по временным рядам на TensorFlow, я столкнулся с несколькими непростыми ситуациями после замены стандартной функции multivariate_data собственным кодом, который реализует оконную выборку данных. Обычно такой подход направлен на экономию памяти, но возникли некоторые проблемы, требующие обсуждения.

1. Неравномерное обучение: потери на обучающей и валидационной выборках

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

  • Неправильная реализация функции dense_1_step, которая, как вы указали, возвращала несколько меток, что может сбивать модель с толку. Когда я изменил код функции, чтобы возвращать только одну метку вместо множества, это исправило ситуацию.

    def dense_1_step(batch):
      # Сдвигаем признаки и метки
      return batch[:-1], batch[-1:, 1][0]  # только вторая метка

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

2. Проблемы с использованием памяти

Проблемы с увеличением использования памяти при вызове fit() могут быть связаны с тем, как данные обрабатываются на этапе создания выборок. Хотя использование генератора должно было бы уменьшить потребление ресурсов, важно удостовериться, что данные обрабатываются эффективно. Вот несколько советов, как улучшить использование памяти:

  • Кеширование выборок и управление размером батча: Убедитесь, что вы используете cache() корректно, чтобы избежать повторной загрузки больших объемов данных во время обучения. Попробуйте уменьшить размер батча и проверить, как это влияет на использование памяти.

    train_data_single = dense_labels_train_ds.cache().shuffle(BUFFER_SIZE).batch(BATCH_SIZE).repeat()
  • Использование prefetch: Это может помочь в параллельной подготовке данных во время тренировки, что снизит время ожидания для каждому батча.

    train_data_single = train_data_single.prefetch(tf.data.experimental.AUTOTUNE)

3. Предупреждение о последовательностях

Предупреждение о том, что наборы не рассматриваются как последовательности, весьма указывает на то, что используемая структура данных не соответствует ожиданиям TensorFlow. Убедитесь, что вы всегда возвращаете последовательные данные в виде tf.data.Dataset. Это обеспечит согласованность в методах обработки.

Заключение

Работа с временными рядами в TensorFlow может быть сложной задачей, особенно при замене стандартных функций. Ошибки в выборке данных могут серьезно повлиять на результативность модели. Оптимизация методов обработки данных, правильный выбор меток и управление памятью являются ключевыми моментами для успешного завершения проекта. Если вы продолжаете сталкиваться с трудностями, настоятельно советую обратиться к документации TensorFlow и сообществу разработчиков для получения дополнительной поддержки. Успехов вам в ваших начинаниях!

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

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