![机器学习实战:模型构建与应用](https://wfqqreader-1252317822.image.myqcloud.com/cover/359/44389359/b_44389359.jpg)
4.4 使用自定义分割
到目前为止,所有你用来构建模型的数据都已经被分割为训练集和测试集。例如,在Fashion MNIST中你分别有60 000和10 000个记录。但是如果你不想使用这些分割而想按照自己的需求来分割数据怎么办?这就是TFDS其中一个非常厉害的地方了,它提供了完整的API使你可以从很好的细粒度来控制如何分割数据。
当像这样加载数据时,你其实已经见过它了:
![](https://epubservercos.yuewen.com/A03276/23627497809544006/epubprivate/OEBPS/Images/089-3.jpg?sign=1739525101-POleuJ8JeI9bYzaYZ5ShABfmGx0gdANX-0-b9a21f70b8321ab205acbe70ecac9608)
注意,这个split
参数是一个字符串,并且在这个例子中你想要的是train
的分割,碰巧是整个数据集。如果你熟悉Python的slice(切片)概念(https://oreil.ly/Enqzq),也可以使用它。这个概念可以被总结为在方括号中定义你想要的片段,例如[<start>: <stop>:<step>]
。这是一个相当复杂的语法,给你提供了非常好的灵活性。
例如,如果你想要train
中前10 000个记录作为训练数据,则可以忽略<start>
并只调用train[:10000]
(一个有用的助记符,将前面的冒号读为“第一个”,因此这读作“训练前10 000个记录”)。
![](https://epubservercos.yuewen.com/A03276/23627497809544006/epubprivate/OEBPS/Images/090-1.jpg?sign=1739525101-F9IFpT1WzqtOQYTW4rt9pq2phqacsGY7-0-1d97fa6e7734dad5e571d5c7cc5b766e)
你也可以使用%来指定分割。例如,如果你想要前20%的记录用于训练,则可以使用:20%
:
![](https://epubservercos.yuewen.com/A03276/23627497809544006/epubprivate/OEBPS/Images/090-2.jpg?sign=1739525101-I5qOOoWHyqFgF0Je4PpG8XyHw2zK7X6Z-0-9062b98df75beab4f0d90ce28c9a17f2)
你还可以合并分割。如果你想你的训练数据是前1000和最后1000个记录,可以像下面这样做(这里-1000:
表示“最后1000个记录”,:1000
表示“前1000个记录”):
![](https://epubservercos.yuewen.com/A03276/23627497809544006/epubprivate/OEBPS/Images/090-3.jpg?sign=1739525101-baU9nFYR9kGCxfOob0eE8wH8w3rJHrso-0-73c0b7c47c98aa5f22b80a258cf6f733)
Dogs vs. Cats数据集不包含固定的训练、测试和验证分割。但是使用TFDS创建你自己的非常简单。假设你想要分割是80%、10%和10%,可以像下面这样创建三个集合:
![](https://epubservercos.yuewen.com/A03276/23627497809544006/epubprivate/OEBPS/Images/090-4.jpg?sign=1739525101-D4nn1jjqqEsXoMJ5A8BV4fdcw31B6yLN-0-f12e0f653c7738c03932272cf09a8f6a)
完成之后,你就可以像使用任意命名的分割那样使用它们。
一个弊端是由于返回的数据集不能查询长度,因此很难检查你是否将原始数据集正确分割了。为了查看你在一个分割中有多少个记录,你不得不遍历整个数据集并逐个计数。这是对你刚创建的训练集进行计数的代码:
![](https://epubservercos.yuewen.com/A03276/23627497809544006/epubprivate/OEBPS/Images/090-5.jpg?sign=1739525101-ijmTcCmsekY5YutdXeKYx0HvAPkIM7B4-0-33365e323425bf69b937858850c2d5e2)
这可能是一个缓慢的过程,因此确保你只在调试时使用它!