如果我有数据集
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的类别。
答案 0 :(得分:0)
这将为您完成分离。您需要做的是创建一个目录,我们将其称为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'。请注意,训练集的洗牌设置为true,而验证集的洗牌设置为False。构建模型时,顶层应具有2个节点,并且激活应为softmax。当您使用model.fit训练模型时,最好每个时期进行一次验证集。假设在狗猫示例中,您有1000张狗图像和1000张猫图像,总共2000张。75%= 1500将用于训练,而500将用于验证。如果您将valid_batch_size = 50设置为50,则每个时期一次将花费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)