Вопрос или проблема
Я пытаюсь уменьшить выборку набора данных временных рядов, чтобы сократить время обучения. Поскольку я использую карту/генератор окон, я хочу применить это уменьшение выборки/удаление после генерации образцов данных, чтобы обеспечить целостность временных рядов в каждом образце.
Я пробовал использовать .filter()
для удаления части образцов, но получаю ошибку “your input ran out of data”, несмотря на использование .repeat()
.
Мой конвейер генератора набора данных выглядит следующим образом:
tf.keras.preprocessing.timeseries_dataset_from_array().map(window_gen).filter(lambda *x: tf.random.uniform([], 0, 1) < 0.2).repeat()
Использование .repeat()
и/или уменьшение параметра steps_per_epoch в model.fit()
для компенсации все равно приводит к ошибке.
Есть ли какие-либо предложения?
Ответ или решение
Проблема, с которой вы столкнулись, требует внимательного рассмотрения взаимодействия различных этапов обработки данных в TensorFlow и понимания того, как работают методы преобразования датасетов. Попробуем поэтапно раскрыть, почему может возникать предупреждение "ваш ввод закончился" и как его можно устранить.
Теоретическая часть
В TensorFlow, когда вы работаете с датасетами, важно учитывать порядок и эффект операций, таких как .map()
, .filter()
, и .repeat()
, а также взаимосвязи между ними. Каждый из этих методов выполняет конкретные функции и влияет на поток данных в вашем пайплайне:
-
map()
: применяется для преобразования данных. В вашем случае, это "генератор окон" (window_gen
), который, вероятно, создает определенные окна временных отрезков на ваших данных, сохраняя временную связанность. -
filter()
: служит для отбора определенных элементов из датасета на основании заданного критерия. В вашей реализации, этот критерий — случайное отбросывание образцов с вероятностью ниже 0.2. Это означает, что каждое окно проходит фильтр с вероятностью менее 20%, приводя к значительному уменьшению объема данных. -
repeat()
: используется для повторения датасета, позволяя повторное использование данных по типу бесконечной петли. Эта операция необходима для случаев, когда мы хотим обучать модели на данных, больше чем данных в исходном наборе.
Когда вы сталкиваетесь с ошибкой "ваш ввод закончился", это происходит в рамках одного шага эпохи обучения, в котором ожидается достаточное количество данных, но из-за фильтрации происходит недостаток образцов.
Пример
Представьте себе исходный набор временных рядов, содержащий 1000 окон. После применения map()
вы получаете полный набор данных, который затем подвергается фильтрации. Предположим, что после применения filter()
остается только 200 окон, так как фильтр отбросил 80% из общего количества. Если steps_per_epoch
установлено на количество, большее, чем 200 окон, то за одну эпоху модель ожидает больше данных, чем есть на самом деле, что и вызывает ошибку.
Применение и рекомендации
Чтобы избежать этой ошибки, можно предпринять несколько шагов:
-
Анализ критерия фильтрации: Пересмотрите критерий внутри
filter()
. Возможно, стоит настроить диапазон вероятности так, чтобы оставалось больше данных. Это обеспечит достаточное количество данных для каждой эпохи обучения. -
Расчет
steps_per_epoch
: Позаботьтесь о том, чтобы параметрsteps_per_epoch
был согласован с новым объемом данных после фильтрации. Это можно сделать вручную путем вычисления ожидаемого количества окон после фильтрации и использования этой величины для заданияsteps_per_epoch
. -
Использование
cache()
: Перед операциейrepeat()
, вы можете добавитьcache()
. Это ускорит чтение данных после первой итерации, уменьшив необходимость повторных проходов по данным. -
Оборачивание в цикл: Если ваш текущий метод обучения позволяет более гибко контролировать эпохи, вы можете имплементировать дополнительную логику, чтобы избегать конца данных, возможно через использование внешнего цикла для обработки эпох.
-
Диагностика и логирование: Добавьте логи, чтобы понимать точно, сколько окон проходит через
filter()
— это поможет диагностировать, стоит ли проблема в слишком агрессивной фильтрации.
Заключение
Предупреждение "ваш ввод закончился данными" — это сигнальная лампа, указывающая на асинхронность ожиданий модели и фактического объема данных из-за действий по отсечению и предварительной обработке. Глубокое понимание каждого этапа пайплайна данных и внимательное управление параметрами помогут сбалансировать процесс обучения, минимизируя риск возникновения подобных ошибок в будущем. Обратите внимание на взаимодействие методологий и вычислительных ресурсов, чтобы оптимизировать процесс подготовки и подачи данных — это ключевое требование успеха в современном аналитическом мире временных рядов.