Tensorflow TFRecords не может разобрать сериализованный пример - PullRequest
0 голосов
/ 19 сентября 2019

При попытке декодировать пример TFRecord появляется следующая ошибка:

InvalidArgumentError: Name:, Feature: релевантность (тип данных: float) требуется, но не может быть найден.[Op: ParseExample]

Для декодирования примера я использую tf.io.parse_example следующим образом

example_features = tf.compat.v1.io.parse_example(
     tf.reshape(serialized_list, [-1]), peritem_feature_spec)

, где serialized_list выглядит как

[ <example_object>, ...
b'\n\xcc\x01\n\x15\n\trelevance\x12\x08\x12\x06\n\x04\x9a\xe9`D\n\xb2
\x01\n\x13encoded_clust_index\x12\x9a\00\ <more...>]

и peritem_feature_spec выглядит как

peritem_feature_spec = {
    'relevance':tf.FixedLenFeature([], tf.float32),
    'encoded_clust_index':tf.VarLenFeature(tf.float32)
    }

Я очень озадачен, почему не удается найти функцию «релевантность».Я думаю, что я закодировал и создал мои объекты TFRecord правильно.Я неправильно создаю feature_spec?Мне кажется, tf.VarLenFeature - это неправильный тип объекта, который я могу использовать, но я не могу понять, что правильно.

Использование tensorflow_ranking.python.data.parse_from_example_in_example способно правильно декодировать TFRecord в его функции, но я не знаю, почему tf.io.parse_example терпит неудачу

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Итак, проблема сводилась к тому, как мои функции добавлялись в библиотеку tenorflow_ranking.Он дополнял функцию списка вроде:

def pad_fn():
    return tf.pad(
        tensor=serialized_list,
        paddings=[[0, 0], [0, list_size -cur_list_size]],
            constant_values="")

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

def pad_fn():
    # Create feature spec for tf.train.Example to append
    pad_spec = {}
    # Default values are 0 or an empty byte string depending on 
    # original serialized data type
    dtype_map = {tf.float32:tf.train.Feature(
            float_list=tf.train.FloatList(value=[0.0])), 
                 tf.int32:tf.train.Feature(
                         int64_list=tf.train.Int64List(value=[0])), 
                 tf.string:tf.train.Feature(
                         bytes_list=tf.train.BytesList(
                                 value=[bytes('', encoding='UTF-8')]))}
     # Create the feature spec
    for key, item in peritem_feature_spec.items():
        dtype = item.dtype
        pad_spec[key] = dtype_map[dtype]
    # Make and serialize example to append
    constant_values = tf.train.Example(
            features=tf.train.Features(feature=pad_spec))
    constant_val_str = constant_values.SerializeToString()

    # Add serialized padding to end of list
    return tf.pad(
        tensor=serialized_list,
        paddings=[[0, 0], [0, list_size - cur_list_size]],
        constant_values=constant_val_str)
0 голосов
/ 19 сентября 2019

Вместо VarLenFeature вы можете попробовать tf.FixedLenSequenceFeature([], tf.float32, allow_missing = True ,default_value=0) объяснил здесь и посмотреть, работает ли это?

...