После того, как я использую набор данных, конкатенация, dataset.map действует только на исходные данные - PullRequest
1 голос
/ 19 сентября 2019

Как видно из заголовка, я объединяю два набора данных и использую функцию карты для изменения положения значения и значения изменения масштаба.Прежде чем я использую карту, все формы Tensor сопоставляются, но после использования функции карты и использования для цикла итерации набора данных для печати индекса, и точка разрыва итерации находится на соединении двух наборов данных.

Я сталкиваюсь с этой проблемой в Colab с использованием графического процессора и использую Python 3.6, tenorflow-gpu 2.0.0b1

dataset_crop = tf.data.Dataset.from_generator(img_resize_and_crop_genr, (tf.float32, tf.float32),((7,), (48,48,1)))
dataset = dataset.concatenate(dataset_crop)
dataset = dataset.map(lambda label, img_raw: (tf.cast(img_raw, tf.float32)/float(255), label))
for i,(label, img) in enumerate(dataset):
  print(i)

Кстати, общая строка набора данных имеет 19984 до объединенияЧто за чертова связь ...

...
19982
19983
---------------------------------------------------------------------------
InvalidArgumentError                      Traceback (most recent call last)
<ipython-input-26-36305ee0e8ef> in <module>()
----> 1 for i,(label, img) in enumerate(dataset):
      2   print(i)

4 frames
/usr/local/lib/python3.6/dist-packages/six.py in raise_from(value, from_value)

InvalidArgumentError: ValueError: Tensor's shape (7,) is not compatible with supplied shape [48, 48, 1]
Traceback (most recent call last):

  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/script_ops.py", line 209, in __call__
    ret = func(*args)

  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/data/ops/dataset_ops.py", line 525, in generator_py_func
    values = next(generator_state.get_iterator(iterator_id))

  File "<ipython-input-25-196a9ac04fc0>", line 5, in img_resize_and_crop_genr
    img.set_shape([side_len, side_len,1])

  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py", line 981, in set_shape
    (self.shape, shape))

ValueError: Tensor's shape (7,) is not compatible with supplied shape [48, 48, 1]


     [[{{node PyFunc}}]] [Op:IteratorGetNextSync]

1 Ответ

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

Проблема в вашей функции from_generator.Когда вы передаете параметр output_shapes, выполняется строгая проверка, чтобы увидеть, является ли выходная фигура точно такой же генерируемой или нет.В вашем случае вы получаете ValueError о том, что он ожидает (48, 48, 1), но (7,) сформированная форма.

Аналогичная ошибка может быть сгенерирована с помощью следующего кода:

dataset = tf.data.Dataset.from_tensor_slices((np.zeros(19984, dtype=np.float32), np.ones(19984, dtype=np.float32)))

def img_resize_and_crop_genr():
    yield np.zeros((7,)), np.ones((48, 48, 1))

dataset_crop = tf.data.Dataset.from_generator(img_resize_and_crop_genr, (tf.float32, tf.float32),((48,48,1), (7,)))
dataset = dataset.concatenate(dataset_crop)
dataset = dataset.map(lambda label, img_raw: (tf.cast(img_raw, tf.float32)/float(255), label))
for i,(label, img) in enumerate(dataset):
  print(i)

Вывод:

ValueError: `generator` yielded an element of shape (7,) where an element of shape (48, 48, 1) was expected.

Я полагаю, вы поменяли output_shapes.В этом случае вы можете внести поправку следующим образом:

dataset_crop = tf.data.Dataset.from_generator(img_resize_and_crop_genr, 
                                              (tf.float32, tf.float32),((7,), (48,48,1)))

Кроме того, output_shapes является необязательным параметром.Вы можете избежать проблемы в целом, не передавая параметр, как показано ниже:

dataset_crop = tf.data.Dataset.from_generator(img_resize_and_crop_genr, 
                                              (tf.float32, tf.float32))
...