Добавить набор данных TensorFlow с тензорами неизвестного размера - PullRequest
1 голос
/ 27 февраля 2020

Я хотел бы добавить набор данных TensorFlow в TFDS, который содержит группу тензоров ранга 2 с неизвестными формами. Для определения функций я использую следующую функцию tfds.features.Tensor(shape=[None, None], dtype=tf.float32). Однако при попытке загрузить набор данных происходит сбой с ошибкой:

NotImplementedError: Specification error for feature k (TensorInfo(shape=[None, None], dtype=tf.float32)): Tensor with a unknown dimension not at the first position not supported: TensorInfo(shape=[None, None], dtype=tf.float32)

Минимальный пример для воспроизведения ошибки ( Реальный пример на Github ):

import numpy as np
import tensorflow as tf
import tensorflow_datasets as tfds


class RandomTensors(tfds.core.GeneratorBasedBuilder):

    VERSION = tfds.core.Version('0.1.0')

    def _info(self):
        return tfds.core.DatasetInfo(
            builder=self,
            description="",
            features=tfds.features.FeaturesDict({
                'k':
                tfds.features.Tensor(shape=[None, None], dtype=tf.float32)
            }),
            homepage="",
            citation="",
        )

    def _split_generators(self, dl_manager: tfds.download.DownloadManager):
        return [
            tfds.core.SplitGenerator(
                name=tfds.Split.TEST,
                gen_kwargs={},
            ),
        ]

    def _generate_examples(self):
        for idx in range(100):
            size = np.random.uniform(10, 20, size=(2, )).astype(np.int32)
            k = np.random.normal(size=size).astype(np.float32)
            yield idx, {'k': k}


if __name__ == '__main__':
    d = tfds.load('random_tensors', split='test')

Не поддерживаются ли тензоры с неизвестными размерами в наборах данных TensorFlow? Или у меня в коде ошибка?

1 Ответ

0 голосов
/ 27 февраля 2020

Я не думаю, что это возможно сделать с наборами данных TensorFlow, потому что, как объясняется в сообщении об ошибке, только первое измерение (обычно измерение пакета) может быть динамическим c.

этот объект tf.data.Dataset обычно ожидает прямоугольный массив angular. Сбой следующего, например:

tf.data.Dataset.from_tensor_slices([[1], [1, 2]])

Это можно было бы сделать напрямую с объектом tf.data.Dataset, но вы не сможете группировать образцы в размере пакета> = 2, потому что их формы различаются.

def _generate_examples():
    for idx in range(100):
        size = np.random.uniform(10, 20, size=(2, )).astype(np.int32)
        k = np.random.normal(size=size).astype(np.float32)
        yield k

d = tf.data.Dataset.from_generator(_generate_examples, output_types=np.float32)
next(iter(d))  # Works!

next(iter(d.batch(2)))
# Fails with error: 
# InvalidArgumentError: Cannot batch tensors with different shapes in component 0.
# First element had shape [11,10] and element 1 had shape [13,17].

Возможно, вы захотите изучить возможность использования большего тензора с формой stati c, а затем заполнить его динамическим меньшим тензором. Таким образом, у вас есть статическая форма c, но у вас все еще есть данные динамической формы. Форма динамических данных c может быть особенностью набора данных, который выдается в генераторе вместе с индексом и данными.

...