TFRecords, закодированные как BytesList с байтами, но только иногда декодируют из записи как int64, выбрасывая InvalidArgumentError - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть множество массивов dtype int32, которые кодируются с помощью ndarray.tostring (), а затем в виде _bytes_feature в отдельные файлы TFRecord, например:

_bytes_feature = lambda string: tf.train.Feature(bytes_list=tf.train.BytesList(value=[string]))
labels = np.array([1, 2, 3, 4])
labels_raw = labels.tostring()
assert isinstance(labels_raw, bytes)
features = {"labels": _bytes_feature(labels_raw)}
example = tf.train.Example(features=tf.train.Features(feature=features))
with tf.python_io.TFRecordWriter(record_path + sound_name + "_{}.tfrecords".format(i)) as writer:
    writer.write(example.SerializeToString())

Я прочитал их из файлов, используя

def parser(serialized_example):
    features_description = {'labels': tf.FixedLenFeature([], tf.string)}
    features = tf.parse_single_example(serialized_example, features_description)
    labels = tf.decode_raw(features['labels'], tf.int32)
    return labels

dataset = tf.data.TFRecordDataset(list_of_tfrecords_files)
dataset = dataset.map(parser)

Этот процесс работает без проблем для примерно 30K различных массивов меток, однако примерно для 500 из этих массивов:

InvalidArgumentError: Key: labels.  Data types don't match. Data type: int64 but expected type: string
 [[{{node ParseSingleExample/ParseSingleExample}} = ParseSingleExample[Tdense=[DT_INT64, DT_STRING, DT_INT64, DT_STRING], dense_keys=["image/height", "image/mfcc", "image/width", "labels"], dense_shapes=[[], [], [], []], num_sparse=0, sparse_keys=[], sparse_types=[]](arg0, ParseSingleExample/Const, ParseSingleExample/Const_1, ParseSingleExample/Const, ParseSingleExample/Const_1)]]
 [[{{node IteratorGetNext}} = IteratorGetNext[output_shapes=[[?,?,?,1], [?,80]], output_types=[DT_FLOAT, DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](IteratorV2)]]

Я проверил, на каких массивах меток это происходит, и, похоже, нет заметных отличий от тех, с которыми работает процесс.

>>> tf.__version__
'1.12.0'

Python 3.6.8

1 Ответ

0 голосов
/ 26 апреля 2019

Это на самом деле оказалось несколько человеческой ошибкой. Я постоянно переписывал файлы tfrecord, когда узнал о их создании, или так я думал. Ранее я писал метки в виде списка int64, и эти файлы по какой-то причине не перезаписывались. Следовательно, почему они все еще были int64, когда они были вызваны синтаксическим анализатором. После полного удаления всех записей и повторного создания и анализа указанных файлов процесс прошел без сбоев.

...