tf.tensor 的定义明确的维度是莫名其妙的“None”
The well-defined dimension of a tf.tensor is inexplicably `None`
以下示例摘自 the official TensorFlow tutorial 数据管道。基本上,一个人将一堆 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
?
教程中您缺少这一部分
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 函数传递给它的每个图像。
以下示例摘自 the official TensorFlow tutorial 数据管道。基本上,一个人将一堆 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
?
教程中您缺少这一部分
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 函数传递给它的每个图像。