Пример ниже взят из официального руководства 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
в этой последней строке?