Как перебрать набор данных tenorflow? - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь построить конвейеры данных из tfrecords, вот мой код

def _parse_image_function(example_proto):
    keys_to_features = {
        'image/encoded': tf.io.FixedLenFeature((), tf.string),
        'image/format': tf.io.FixedLenFeature((), tf.string, default_value='jpeg'),
        'image/height': tf.io.FixedLenFeature([1], tf.int64),
        'image/width': tf.io.FixedLenFeature([1], tf.int64),
        'image/channels': tf.io.FixedLenFeature([1], tf.int64),
        'image/shape': tf.io.FixedLenFeature([3], tf.int64),
        'image/object/bbox/xmin': tf.io.VarLenFeature(dtype=tf.float32),
        'image/object/bbox/ymin': tf.io.VarLenFeature(dtype=tf.float32),
        'image/object/bbox/xmax': tf.io.VarLenFeature(dtype=tf.float32),
        'image/object/bbox/ymax': tf.io.VarLenFeature(dtype=tf.float32),
        'image/object/bbox/label': tf.io.VarLenFeature(dtype=tf.int64),
        'image/object/bbox/difficult': tf.io.VarLenFeature(dtype=tf.int64),
        'image/object/bbox/truncated': tf.io.VarLenFeature(dtype=tf.int64),
    }

    example = tf.io.parse_single_example(example_proto, keys_to_features)
    image = tf.io.decode_raw(example['image/encoded'], tf.int32)
    return image

Затем я получаю изображение после декодирования

    for img in train_ds:
        print(img.numpy())

Но я получил ошибку

tensorflow.python.framework.errors_impl.InvalidArgumentError: {{function_node __inference_Dataset_map__parse_image_function_78}} Input to DecodeRaw has length 286478 that is not a multiple of 4, the size of int32
     [[{{node DecodeRaw}}]] [Op:IteratorGetNextSync]

Как мне это исправить?

1 Ответ

1 голос
/ 09 февраля 2020

Как уже упоминалось в комментариях, сообщение об ошибке касается ошибки декодирования, а не проблемы с итерацией. Вы создаете объект набора данных и правильно итерируете его.

image = tf.io.decode_raw(example['image/encoded'], tf.int32) говорит TensorFlow декодировать данные, хранящиеся в этом ключе, как тензор int32 с. То есть необработанные двоичные значения 32-разрядных целых чисел, например, содержимое .data в массиве NumPy с dtype=np.int32.

, поскольку вы прочитали в двоичном содержимом .jpg файлы, я предполагаю, что у вас есть двоичные файлы изображений JPEG с этим значением ключа. В этом случае вам следует использовать метод decode_jpeg. Вы должны использовать:

image = tf.io.decode_jpeg(example['image/encoded']).

decode_jpeg также предоставляет вам несколько вариантов того, как вы будете sh данные JPEG для декодирования (например, только в оттенках серого, с повышением цветности) метод). Полная документация decode_jpeg доступна здесь

Кроме того, TensorFlow также предоставляет decode_image, который автоматически вызывает правильный декодер поддерживаемого формата изображения с учетом двоичных данных. Смотри документы здесь .

...