我是tensorflow/keras的新手,我有一个包含3000个文件夹的文件结构,每个文件夹包含200张图像,作为数据加载。我知道keras.preprocessing.image_dataset_from_directory允许我加载数据,并将其拆分为训练/验证集,如下所示:
val_data = tf.keras.preprocessing.image_dataset_from_directory('etlcdb/ETL9G_IMG/',
image_size = (128, 127),
validation_split = 0.3,
subset = "validation",
seed = 1,
color_mode = 'grayscale',
shuffle = True)
找到607200个文件,属于3036个类。正在使用182160个文件进行验证。
但是我不确定如何在保持正确类的同时进一步将验证拆分为测试拆分。从我所知道的(通过GitHub源代码)来看,take方法只取数据集的前x个元素,skip也是如此。我不确定这是否保持了数据的分层,也不确定如何从数据集返回标签来测试它。
任何帮助都将不胜感激。
3条答案
按热度按时间jexiocij1#
我找不到支持文档,但我相信
image_dataset_from_directory
将数据集的末尾部分作为验证分割。shuffle
现在默认设置为True
,因此在训练之前对数据集进行了混洗,以避免只使用某些类别进行验证分割。image_dataset_from_directory
所做的分割只与训练程序相关。如果您需要(强烈推荐)测试拆分,您应该事先将您的数据拆分为训练和测试。然后,image_dataset_from_directory
会将您的训练数据拆分为训练和验证。我通常取一个较小的百分比(10%)用于训练中的验证,并将原始数据集拆分为80%训练,20%测试。
在此问题中,还提供了有关如何拆分目录中的数据的其他信息:Keras split train test set when using ImageDataGenerator
yeotifhr2#
对于分裂成培训和验证,也许你可以这样做。
最主要的一点是保持同一个种子。
取自:https://keras.io/examples/vision/image_classification_from_scratch/
1tu0hz3e3#
您几乎已经得到了答案。关键是使用
.take()
和.skip()
将验证集进一步拆分为两个数据集--一个用于验证,另一个用于测试。如果使用您的示例,则需要执行以下代码行。假设您需要70%用于训练集,10%用于验证集,20%用于测试集。为了完整起见,我还包括了生成训练集的步骤。让我们也分配一些基本变量,这些变量在第一次将整个数据集拆分为训练集和验证集时必须相同。接下来,使用
tf.data.experimental.cardinality
确定验证集中有多少批数据可用,然后将其中的三分之二(30%的2/3 = 20%)移动到测试集中,如下所示。请注意,batch_size
的默认值为32(re:文档)。所有这三个数据集(
train_ds
、val_ds
和test_ds
)都生成了一批图像以及从目录结构推断出的标签。