TensorFlow 数据集:通过 For 循环迭代时顺序出现随机化?
TensorFlow Dataset: Order appears randomised when iterating via For loop?
我正在创建一些批量 TensorFlow 数据集 tf.keras.preprocessing.image_dataset_from_directory:
image_size = (90, 120)
batch_size = 32
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
os.path.join(model_split_dir,'train'),
validation_split=0.25,
subset="training",
seed=1,
image_size=image_size,
batch_size=batch_size
)
val_ds = tf.keras.preprocessing.image_dataset_from_directory(
os.path.join(model_split_dir,'train'),
validation_split=0.25,
subset="validation",
seed=1,
image_size=image_size,
batch_size=batch_size
)
test_ds = tf.keras.preprocessing.image_dataset_from_directory(
os.path.join(model_split_dir,'test'),
seed=1,
image_size=image_size,
batch_size=batch_size
)
如果我随后使用以下 for 循环从其中一个数据集获取图像和标签信息,我每次 运行 都会得到不同的输出:
for images, labels in test_ds:
print(labels)
例如,第一个批次会出现这样的 运行:
tf.Tensor([0 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1], shape=(32,), dtype=int32)
但是再循环一次运行就完全不一样了;
tf.Tensor([1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 0 1 1 0 0], shape=(32,), dtype=int32)
怎么每次循环顺序都不一样? TensorFlow 数据集是无序的吗?根据我的发现,它们应该是有序的,所以我不知道为什么 for 循环 returns 标签每次都以不同的顺序排列。
任何对此的见解将不胜感激。
更新:数据集顺序的改组按预期进行。对于我的测试数据,我只需要将 shuffle 设置为 False。非常感谢@AloneTogether !
tf.keras.preprocessing.image_dataset_from_directory
的参数shuffle
默认设置为True
,如果你想要确定性的结果,可以尝试设置为False
:
import tensorflow as tf
import pathlib
dataset_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"
data_dir = tf.keras.utils.get_file('flower_photos', origin=dataset_url, untar=True)
data_dir = pathlib.Path(data_dir)
train_ds = tf.keras.utils.image_dataset_from_directory(
data_dir,
validation_split=0.2,
subset="training",
image_size=(28, 28),
batch_size=5,
shuffle=False)
for x, y in train_ds:
print(y)
break
另一方面,这将始终产生随机结果:
train_ds = tf.keras.utils.image_dataset_from_directory(
data_dir,
seed=None,
image_size=(28, 28),
batch_size=5,
shuffle=True)
for x, y in train_ds:
print(y)
break
如果您设置随机种子和 shuffle=True
,数据集将被打乱一次,但您将获得确定性的结果:
train_ds = tf.keras.utils.image_dataset_from_directory(
data_dir,
seed=123,
image_size=(28, 28),
batch_size=5,
shuffle=True)
for x, y in train_ds:
print(y)
break
我正在创建一些批量 TensorFlow 数据集 tf.keras.preprocessing.image_dataset_from_directory:
image_size = (90, 120)
batch_size = 32
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
os.path.join(model_split_dir,'train'),
validation_split=0.25,
subset="training",
seed=1,
image_size=image_size,
batch_size=batch_size
)
val_ds = tf.keras.preprocessing.image_dataset_from_directory(
os.path.join(model_split_dir,'train'),
validation_split=0.25,
subset="validation",
seed=1,
image_size=image_size,
batch_size=batch_size
)
test_ds = tf.keras.preprocessing.image_dataset_from_directory(
os.path.join(model_split_dir,'test'),
seed=1,
image_size=image_size,
batch_size=batch_size
)
如果我随后使用以下 for 循环从其中一个数据集获取图像和标签信息,我每次 运行 都会得到不同的输出:
for images, labels in test_ds:
print(labels)
例如,第一个批次会出现这样的 运行:
tf.Tensor([0 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1], shape=(32,), dtype=int32)
但是再循环一次运行就完全不一样了;
tf.Tensor([1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 0 1 1 0 0], shape=(32,), dtype=int32)
怎么每次循环顺序都不一样? TensorFlow 数据集是无序的吗?根据我的发现,它们应该是有序的,所以我不知道为什么 for 循环 returns 标签每次都以不同的顺序排列。
任何对此的见解将不胜感激。
更新:数据集顺序的改组按预期进行。对于我的测试数据,我只需要将 shuffle 设置为 False。非常感谢@AloneTogether !
tf.keras.preprocessing.image_dataset_from_directory
的参数shuffle
默认设置为True
,如果你想要确定性的结果,可以尝试设置为False
:
import tensorflow as tf
import pathlib
dataset_url = "https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"
data_dir = tf.keras.utils.get_file('flower_photos', origin=dataset_url, untar=True)
data_dir = pathlib.Path(data_dir)
train_ds = tf.keras.utils.image_dataset_from_directory(
data_dir,
validation_split=0.2,
subset="training",
image_size=(28, 28),
batch_size=5,
shuffle=False)
for x, y in train_ds:
print(y)
break
另一方面,这将始终产生随机结果:
train_ds = tf.keras.utils.image_dataset_from_directory(
data_dir,
seed=None,
image_size=(28, 28),
batch_size=5,
shuffle=True)
for x, y in train_ds:
print(y)
break
如果您设置随机种子和 shuffle=True
,数据集将被打乱一次,但您将获得确定性的结果:
train_ds = tf.keras.utils.image_dataset_from_directory(
data_dir,
seed=123,
image_size=(28, 28),
batch_size=5,
shuffle=True)
for x, y in train_ds:
print(y)
break