От .tfrecord к tf.data.Dataset к tf.keras.model.fit - PullRequest
1 голос
/ 13 января 2020

Я пытаюсь использовать API наборов данных Tensorflow (v2.0) для передачи больших объемов данных в tf.keras.model. Вот упрощенная версия моего набора данных:

for rec in my_dataset:
    print(repr(rec))

$ {'feature0': <tf.Tensor: id=528, shape=(), dtype=float32, numpy=0.2963>,
'feature1': <tf.Tensor: id=618, shape=(), dtype=int64, numpy=0>,
'feature2': <tf.Tensor: id=620, shape=(), dtype=string, numpy=b'Inst1'>,
'target': <tf.Tensor: id=621, shape=(), dtype=int64, numpy=2>}
{'feature0': <tf.Tensor: id=528, shape=(), dtype=float32, numpy=0.4633>,
'feature1': <tf.Tensor: id=618, shape=(), dtype=int64, numpy=1>,
'feature2': <tf.Tensor: id=620, shape=(), dtype=string, numpy=b'Inst4'>,
'target': <tf.Tensor: id=621, shape=(), dtype=int64, numpy=0>}

... и так далее. Каждая запись в объекте my_dataset является словарем с именами объектов (и целей) в качестве ключей и связанными тензорами в качестве значений. Я создал набор данных из нескольких файлов .tfrecord, поэтому я ограничен в том смысле, что каждый тензор соответствует объекту tf.train.Example (обертка). Набор данных точно соответствует формату, представленному в документации по тензорному потоку (см., Например, последний пример кода в https://www.tensorflow.org/tutorials/load_data/tfrecord#reading_a_tfrecord_file).

Я хотел бы использовать этот набор данных с кератами. Кажется, объекты tf.keras.model, с которыми я работаю, для своей функции fit принимают в качестве входных данных кортеж, представляющий вектор признаков (X) и цель (y). Я думаю, я мог бы выяснить, как преобразовать тензоры из моего набора данных в массивы numpy и передать их в модель таким образом, или выполнить итерацию по набору данных с помощью итератора, но если я правильно понимаю, это, похоже, разрушает всю цель используя API наборов данных для начала (см., например, https://www.tensorflow.org/guide/keras/overview#train_from_tfdata_datasets).

Мой вопрос: как правильно преобразовать my_dataset в некую форму, tf.keras.model.fit() получит? Или, если это неправильный вопрос, какие фундаментальные понятия мне не хватает, которые мешают мне задать правильный? (Например, должны ли примеры .tfrecord быть структурированы по-другому? Или мне нужно использовать итератор вместо прямой передачи my_dataset в модель, как я бы предпочел?)

1 Ответ

0 голосов
/ 18 января 2020

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

def proces_example(serialized_example):
    feature_description = get_feature_desc()  # dictionary describing features and dtypes
    target_name = get_target_name()  # so we don't include the target in our feature vector
    parsed_example = tf.io.parse_single_example(serialized_example, feature_description)
    tensor_list = []
    for tensor in parsed_example:
        if tensor != target_name:
            parsed_example[tensor] = tf.dtypes.cast(parsed_example[tensor], tf.float32)
            tensor_list.append(parsed_example[tensor])
    X = tf.stack(tensor_list)
    y = parsed_example[target_name]
    return X, y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...