Преобразование дат в тензорный поток или тензорный поток расширен
Я работаю с Tensorflow Extended, данными предварительной обработки, и среди этих данных есть значения даты (например, значения в форме 16-04-2019). Мне нужно применить некоторую предварительную обработку к этому, например, разницу между двумя датами и извлечением из нее дня, месяца и года.
Например, мне может понадобиться разница в днях между 01-04-2019 и 16-04-2019, но эта разница также может охватывать дни, месяцы или годы.
Теперь, просто используя скрипты Python, это легко сделать, но мне интересно, возможно ли это сделать с Tensorflow? Для моего варианта использования важно сделать это в Tensorflow, потому что преобразование должно быть выполнено в формате графа, чтобы я мог обслуживать модель с преобразованиями внутри конвейера.
Я использую Tensorflow 1.13.1, Tensorflow Extended и Python 2.7 для этого.
2 ответа
Публикация аналогичной проблемы на tft github.
Вот как это сделать:
import tensorflow_addons as tfa
import tensorflow as tf
from typing import TYPE_CHECKING
@tf.function(experimental_follow_type_hints=True)
def fn_seconds_since_1970(date_time: tf.string, date_format: str = "%Y-%m-%d %H:%M:%S %Z"):
seconds_since_1970 = tfa.text.parse_time(date_time, date_format, output_unit='SECOND')
seconds_since_1970 = tf.cast(seconds_since_1970, dtype=tf.int64)
return seconds_since_1970
string_date_tensor = tf.constant("2022-04-01 11:12:13 UTC")
seconds_since_1970 = fn_seconds_since_1970(string_date_tensor)
seconds_in_hour, hours_in_day = tf.constant(3600, dtype=tf.int64), tf.constant(24, dtype=tf.int64)
hours_since_1970 = seconds_since_1970 / seconds_in_hour
hours_since_1970 = tf.cast(hours_since_1970, tf.int64)
hour_of_day = hours_since_1970 % hours_in_day
days_since_1970 = seconds_since_1970 / (seconds_in_hour * hours_in_day)
days_since_1970 = tf.cast(days_since_1970, tf.int64)
day_of_week = (days_since_1970 + 4) % 7 #Jan 1st 1970 was a Thursday, a 4, Sunday is a 0
print(f"On {string_date_tensor.numpy().decode('utf-8')}, {seconds_since_1970} seconds had elapsed since 1970.")
Мои два цента по более широкой основной проблеме, здесь вопрос заключается в вычислении разницы во времени, для которой мы хотим выполнять эти вычисления на тензорах. Тогда возникает вопрос: «Каковы единицы этих тензоров?» Это вопрос детализации. «Следующий вопрос: какие типы данных задействованы?» Начните со строки, вероятно, закончите числом. Тогда возникает следующий вопрос: существует ли «родная» функция тензорного потока, которая может это сделать? Введите аддоны тензорного потока !
Точно так же, как мы пытаемся оптимизировать обучение, выполняя все как тензорные операции внутри графа, точно так же нам нужно оптимизировать «попадание в граф». Я видел, как datetime будет работать с функциями Python здесь, и я бы сделал все, что мог, чтобы избежать перехода в область функций Python, поскольку код становится настолько сложным, а производительность также страдает. На мой взгляд, это проигрыш.
PS. Эта операция еще не реализована в Windows в соответствии с этим , возможно, потому, что она возвращает только временные метки unix :)
У меня была аналогичная проблема. Проблема связана с проверкой if в TFX, которая не принимает во внимание типы дат. Насколько я понял, есть два варианта:
Предварительно обработайте столбец даты и приведите его к
int
(например, звонокtoordinal()
на каждом элементе) перед чтением его в TFXОтредактируйте функцию TFX, которая проверяет типы для учета типов, подобных дате, и на лету приводите их к порядковому номеру.
Вы можете перейти к venv/lib/python3.7/site-packages/tfx/components/example_gen/utils.py
и ищем функцию dict_to_example
. Вы можете добавить туда проверку даты и времени вот так
def dict_to_example(instance: Dict[Text, Any]) -> tf.train.Example:
"""Converts dict to tf example."""
feature = {}
for key, value in instance.items():
# TODO(jyzhao): support more types.
if isinstance(value, datetime.datetime): # <---- Check here
value = value.toordinal()
if value is None:
feature[key] = tf.train.Feature()
...
value
станет int
, а int
будет обработан и приведен к типу Tensorflow позже в функции.