Вопрос или проблема
Я следил за этим учебным руководством по временным рядами для 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()
Но по какой-то причине всё пошло не так по следующим причинам…
- Потеря на обучении и валидации теперь совершенно не похожи, и, честно говоря, я не думаю, что сеть даже учится должным образом.
- Использование памяти кажется гораздо лучше, ПОКА вы не выполните fit(), и тогда она просто взрывается более-менее так же.
- Я получаю предупреждение ‘Множества в настоящее время не считаются последовательностями, но это может измениться в будущем, поэтому подумайте о том, чтобы избежать их использования.’
Я уверен, что я что-то сломал здесь, но мне кажется, что это делает то, что должно делать. Я всё ещё нахожусь на крутом пути обучения, но если кто-то с большим опытом мог бы указать мне верное направление, я был бы очень благодарен.
Спасибо.
Похоже, я возвращал несколько признаков в качестве меток. Мне пришлось изменить функцию 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 и сообществу разработчиков для получения дополнительной поддержки. Успехов вам в ваших начинаниях!