Четко определенное измерение tf.tensor необъяснимо `None` - PullRequest
0 голосов
/ 27 апреля 2020

Пример ниже взят из официального руководства TensorFlow по конвейерам данных. По сути, размер JPG меняется на (128, 128, 3). По какой-то причине при применении операции map() измерение цвета, а именно 3, превращается в None при проверке формы набора данных. Почему выделяется это третье измерение? (Я проверил, есть ли изображения, которые не (128, 128, 3), но не нашли).

Во всяком случае, None должен отображаться только для самого первого измерения, т.е. который подсчитывает количество примеров и не должен влиять на отдельные размеры примеров, поскольку - как вложенные структуры - они должны иметь одинаковую форму в любом случае, чтобы быть сохраненными как tf.data.Dataset s.

Код в TensorFlow 2.1:

import pathlib
import tensorflow as tf

# Download the files.
flowers_root = tf.keras.utils.get_file(
    'flower_photos',
    'https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',
    untar=True)
flowers_root = pathlib.Path(flowers_root)

# Compile the list of files.
list_ds = tf.data.Dataset.list_files(str(flowers_root/'*/*'))

# Reshape the images.
# Reads an image from a file, decodes it into a dense tensor, and resizes it
# to a fixed shape.
def parse_image(filename):
  parts = tf.strings.split(file_path, '\\') # Use the forward slash on Linux
  label = parts[-2]

  image = tf.io.read_file(filename)
  image = tf.image.decode_jpeg(image)
  image = tf.image.convert_image_dtype(image, tf.float32)
  image = tf.image.resize(image, [128, 128])
  print("Image shape:", image.shape)
  return image, label

print("Map the parse_image() on the first image only:")
file_path = next(iter(list_ds))
image, label = parse_image(file_path)

print("Map the parse_image() on the whole dataset:")
images_ds = list_ds.map(parse_image)

и дает

Map the parse_image() on the first image only:
Image shape: (128, 128, 3)
Map the parse_image() on the whole dataset:
Image shape: (128, 128, None)

Почему None в этой последней строке?

1 Ответ

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

Из этого урока вы пропустили эту часть

for image, label in images_ds.take(5):
    show(image, label)

Строка

images_ds = list_ds.map(parse_image)

создает только заполнитель, и изображение не передается в функцию, если вы положили, печатает file_path не указан, но если вы используете

for image, label in images_ds.take(5)

, он перебирает каждое изображение, передавая его через функцию parse_image.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...