Создание набора данных тензорного потока изображений и меток из простых списков python - PullRequest
0 голосов
/ 29 апреля 2020

Я пытался использовать различные источники вдохновения - в частности, этот - для создания маркированного набора данных изображений для передачи model.fit () .

Мой код кажется эквивалентным приведенному в ответе на этот вопрос ... с немного другим _parse_function() по сравнению с ОП вопроса:

def load_image( path, label ):
  file_contents = tf.io.read_file( path )
  image = tf.image.decode_image( file_contents )
  image = tf.image.convert_image_dtype( image, tf.float32 )
  return image, label

Я могу проверить это функционируют независимо в командной строке python, например, с image, label = load_image( "tiger.jpg", "Tiger" ) и заканчиваются меткой "Tiger" и image[0][0], которая правильно соответствует верхнему левому пикселю изображения:

>>> image[0][0]
<tf.Tensor: shape=(3,), dtype=float32, numpy=array([0.37254903, 0.5529412 , 0.854902  ], dtype=float32)>

Аналогично, если я попробую print( image[ 0 ][ 0 ] из моей программы, я получу:

tf.Tensor([0.37254903 0.5529412  0.854902  ], shape=(3,), dtype=float32)

Я новичок в python, так что я надеюсь, что это просто эквивалентные варианты темы, но в любом случае, когда я передаю все в model.fit() в моей программе, я получаю:

 ValueError: Cannot take the length of shape with unknown rank.

Никакие изменения ни по одной теме не подняли меня за пределы этого пункта. Я удалил все конвейерные операции из набора данных (например, нет .shuffle(), нет .repeat(), нет .batch()), поэтому я использую только функцию .map() и получаю тот же результат ошибки. Единственные места, где я могу видеть ошибку, это указанная выше функция load_image() или код вызова:

dataset = tf.data.Dataset.from_tensor_slices( ( images, labels ) )   # tf.constant() does not change error
dataset = dataset.map( load_map )
model.fit( dataset, epochs=100 )

В чем причина ошибки?

1 Ответ

0 голосов
/ 30 апреля 2020

Существует известная проблема с decode_image - он неправильно устанавливает информацию о форме (см. здесь . Вы можете использовать более конкретный c вызов - например, decode_jpeg или decode_png.

Также ... следующая проблема, с которой вы столкнетесь, заключается в том, что вы не можете напрямую использовать ярлыки, такие как «Тигр». Если «Тигр» находится в списке категорий, таких как [«Лев», «Тигр», «Зебра» "," Обезьяна ", ...] тогда вам нужно либо использовать индекс" Тигр "в таком списке (то есть 1), либо одноразовое представление (то есть [False,True,False,False,...])

...