Проблема с итератором Tensorflow, возвращающим кортежи - PullRequest
0 голосов
/ 08 мая 2019

Я хочу выполнить итерацию по набору данных TF для того, чтобы преобразовать полученные данные в кусочные тензоры. Будучи новичком в tenorflow, вот как выглядит мой код

  def convert_dataset_to_pytorch(self, dataset):
    sess = tf.Session(config=self.config)

    iterator = dataset.make_one_shot_iterator()
    exampleTF, labelsTF = iterator.get_next()

    examples = torch.Tensor()
    labels = torch.Tensor()

    try:
      while True:
        examples = torch.cat((examples,torch.Tensor(exampleTF.eval(session=sess))),0)
        labels = torch.cat((labels,torch.Tensor([labelsTF.eval(session=sess)])),0)
    except tf.errors.OutOfRangeError:
      pass

    return examples, labels

Очевидная проблема заключается в том, что каждый вызов eval () повторяется как в exampleTF, так и в метках labelTF, таким образом пропуская половину записей. Любая помощь? Я также попробовал что-то вроде

  def convert_dataset_to_pytorch(self, dataset):
    sess = tf.Session(config=self.config)

    iterator = dataset.make_one_shot_iterator()
    next_element = iterator.get_next()

    examples = torch.Tensor()
    labels = torch.Tensor()

    try:
      while True:
        sess.run(next_element)
        examples = torch.cat((examples,torch.Tensor(next_element[0])),0)
        labels = torch.cat((labels,torch.Tensor([next_element[0]])),0)
    except tf.errors.OutOfRangeError:
      pass

    return examples, labels

но это приводит только к ошибкам вида

examples = torch.cat((examples,torch.Tensor(next_element[0])),0)
TypeError: object of type 'Tensor' has no len()

1 Ответ

0 голосов
/ 08 мая 2019

Не уверен, почему вы создаете тензор pytorch в тензорном потоке, когда все, что вам нужно, это просто тензор.Чтобы ответить на ваш вопрос (упомянутый ниже)

, выполните итерацию по набору данных TF, чтобы преобразовать полученные данные в пустые тензоры.

Пример кода:

import numpy as np

inc_dataset = tf.data.Dataset.range(100)
dec_dataset = tf.data.Dataset.range(0, -100, -1)
dataset = tf.data.Dataset.zip((inc_dataset, dec_dataset))

iterator = dataset.make_one_shot_iterator()
next_element = iterator.get_next()

result = list()
with tf.Session() as sess:
    try:
        while True:
          result.append(sess.run(next_element)) 
    except tf.errors.OutOfRangeError:
          pass

examples = np.array(list(zip(*result))[0])
labels = np.array(list(zip(*result))[1])

Теперь вы можете конвертировать массивы examples и labels np в тензоры потока или тензорного потока или в любые другие тензоры, которые вы хотите.

...