【问题标题】:how to split up tf.data.Dataset into x_train, y_train, x_test, y_test for keras如何将 tf.data.Dataset 拆分为 keras 的 x_train、y_train、x_test、y_test
【发布时间】:2021-01-13 12:53:00
【问题描述】:

如果我有数据集

dataset = tf.keras.preprocessing.image_dataset_from_directory(
    directory,
    labels="inferred",
    label_mode="int",
    class_names=None,
    color_mode="rgb",
    batch_size=32,
    image_size=(32, 32),
    shuffle=True,
    seed=None,
    validation_split=None,
    subset=None,
    interpolation="bilinear",
    follow_links=False,
)

如何将它分成 x 和 y 数组? x 数组将是 IMG 数组,y 数组将包含每个 img 的类别。

【问题讨论】:

  • 查看修改后答案底部添加的代码

标签: python image tensorflow machine-learning keras-2


【解决方案1】:

这将为您完成分离。您需要做的是创建一个目录,我们将其命名为 c:\train。现在在该目录中,您将需要创建一系列子目录,每个类一个。例如,如果你有狗的图像和猫的图像,并且你想构建一个分类器来区分图像是猫还是狗,那么在 train 目录中创建两个子目录。将一个目录命名为猫,将另一个子目录命名为狗。现在将所有猫的图像放在 cat 子目录中,将所有狗的图像放在 dogs 子目录中。现在让我们假设您想使用 75% 的图像进行训练,使用 25% 的图像进行验证。现在使用下面的代码创建一个训练集和一个验证集。

train_batch_size = 50  # Set the training batch size you desire
valid_batch_size = 50  # Set this so that .25 X total sample/valid_batch_size is an integer
dir = r'c:\train'
img_size = 224  # Set this to the desired image size you want to use
train_set = tf.keras.preprocessing.image_dataset_from_directory(
    directory=dir, labels='inferred', label_mode='categorical', class_names=None,
    color_mode='rgb', batch_size=train_batch_size, image_size=(img_size, img_size),
    shuffle=True, seed=None, validation_split=.25, subset="training",
    interpolation='nearest', follow_links=False)
valid_set = tf.keras.preprocessing.image_dataset_from_directory(
    directory=dir, labels='inferred', label_mode='categorical', class_names=None,
    color_mode='rgb', batch_size=valid_batch_size, image_size=(img_size, img_size),
    shuffle=False, seed=None, validation_split=.25, subset="validation",
    interpolation='nearest', follow_links=False)

使用 labels='inferred' 标签将是子目录的名称。在示例中,它们将是猫和狗。使用 label_mode='categorical' 标签数据是一个热向量,所以当你编译你的模型集 loss='CategoricalCrossentropy'。注意,训练集 shuffle 设置为 true,而验证集 shuffle 设置为 False。当您构建模型时,顶层应该有 2 个节点,并且激活应该是 softmax。当您使用 model.fit 训练您的模型时,希望每个 epoch 都检查一次您的验证集。所以说在狗-猫的例子中,你有 1000 张狗图像和 1000 张猫图像,总共 2000 张。75% = 1500 将用于训练,500 将用于验证。如果您设置 valid_batch_size=50,则每个 epoch 将需要 10 个步骤来遍历所有验证图像。同样,如果 train_batch_size=50 将需要 30 步才能通过训练集。当您运行 model.fit 时,设置 steps_per_epoch=30 和 validation_steps=10。其实我更喜欢使用 tf.keras.preprocessing.image.ImageDataGenerator 来生成数据集。它相似但更通用。文档是 here. 如果喜欢它,因为它允许您根据需要指定预处理功能,并且还允许您重新调整图像值。通常您希望使用 1/255 作为重新缩放值。

如果您只想拆分训练数据,可以使用 sklearn 中的 train_test_split。文档为 here.,下面的代码显示了如何将其分成训练集、验证集和测试集。假设您需要 80% 的数据用于训练,10% 用于验证,10% 用于测试。假设 X 是一个 np 图像数组,y 是相关的标签数组。下面的代码显示了拆分

from sklearn.model_selection import train_test_split
X_train, X_tv, y_train, y_tv = train_test_split( X, y, train_size=0.8, random_state=42)
X_test, X_valid, y_test, y_valid=train_test_split(X_tv,y_tv, train_size=.5, randon_state=20)

【讨论】:

  • 谢谢,但有没有办法将该训练数组拆分为不同的图像和标签数组?
  • 有没有办法从第一个代码sn-p中的train_set中检索X和y
  • 您可以在循环中使用 take() 方法来获取图像和标签。 ds = tfds.load('mnist', split='train') ds = ds.take(1) # ds中只取一个例子: # 例子是{'image': tf.Tensor, 'label': tf.Tensor} print(list(example.keys() )) image = example["image"] label = example["label"] print(image.shape, label)
  • 我们需要使用 shuffle=True 进行验证,否则两个生成器的采样图像将重叠。请编辑您的答案! @GerryP
猜你喜欢
  • 2021-02-15
  • 2019-06-17
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 2022-01-14
  • 2018-11-28
相关资源
最近更新 更多