第三篇 FastAI数据构造API

2024-02-27 00:32

本文主要是介绍第三篇 FastAI数据构造API,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇博客介绍了如何调用ImageDataBunch的工厂类方法,生成Fast AI的模型所需的数据包(Data Bunch)。事实上,Fast AI提供了一系列函数接口,使得构建数据包的流程更符合逻辑且更灵活,而前述博客所示的工厂类方法其实也是基于这些API进行构建的。本篇博客将介绍相关的数据类型以及API

一、Fast AI的数据积木(Data Block)API (文档链接)

DataBunch类的功能就是整合trainvalid的数据加载器(即PyTorch里的DataLoader)。而使用Data Block API一步一步构建DataBunch的流程如下图所示:

图 1. 使用DataBlock API构建DataBunch的流程
对于该流程中各个步骤以及所用的类介绍如下。
1. 数据列表:ItemList

ItemList是用于存储数据的列表类(即提供了索引功能)。针对不同的任务以及各类型的标签,Fast AI提供了ItemList的各种子类,其中与视觉应用相关的子类包括:

  • CategoryList: 分类问题的类别标签列表
  • MultiCategoryList: 多标签问题的多类别标签列表
  • FloatList: 回归问题的浮点数标签列表
  • ImageList: 图像(标签)列表
  • SegmentationLabelList: 分割任务的掩膜标签列表
  • ObjectLabelList: 目标检测任务的目标框标签列表
  • PointsItemList: 关键点检测任务的点标签列表

ItemList提供了几种生成ItemList实例的工厂类方法:

  • from_folder()工厂类方法

    @classmethod
    def from_folder(cls,path:PathOrStr, # 数据目录extensions:Collection[str]=None, # 只获取特定扩展名的文件recurse:bool=True, # 是否进行文件路径的迭代查找include:Optional[Collection[str]]=None, # 指定路径的最后一层的列表processor:PreProcessors=None,presort:Optional[bool]=False, # 是否对文件进行排序**kwargs)->'ItemList'
    
  • from_df()工厂类方法

    @classmethod
    def from_df(cls,df:DataFrame,path:PathOrStr='.',cols:IntsOrStrs=0, # 数据所在的列processor:PreProcessors=None, **kwargs)->'ItemList'
    
  • from_csv()工厂类方法

    @classmethod
    def from_csv(cls,path:PathOrStr,csv_name:str,cols:IntsOrStrs=0,delimiter:str=None, header:str='infer',processor:PreProcessors=None, **kwargs)->'ItemList'
    

此外,ItemList还提供了几个用于数据过滤的函数:

  • 1.filter_by_func(func): 按函数返回值是否为真进行筛选。
  • 2.filter_by_folder(include=None, exclude=None): 包含include指定的文件夹,排除exclude指定的文件夹。
  • 3.filter_by_rand(p, seed): 按照一定的比例p筛选数据。
2. 将数据分划为trainvalid

ItemList类提供了若干个用于分划数据集的方法,返回的是一个包含trainvalid两个ItemListItemLists实例。

split_by_rand_pct(valid_pct:float=0.2, seed:int=None)# 按valid_pct指定的比例进行分划。
split_subsets(train_size:float, valid_size:float, seed=None)# 按train_size、valid_size指定的比例进行抽取
split_by_files(valid_names:ItemList) → ItemLists# 按valid_names指定的文件名进行分划
split_by_fname_file(fname:PathOrStr, path:PathOrStr=None)# 按fname文件存储的文件名进行分划
split_by_folder(train:str='train', valid:str='valid')# 按照文件夹的名称进行分划
split_by_idx(valid_idx:Collection[int])# 按照valid_idx指定的索引进行分划
split_by_idxs(train_idx, valid_idx)# 同时指定train和valid两个索引列表
split_by_list(train, valid)# 同时指定train和valid的文件列表
split_by_valid_func(func:Callable)# 传入文件名,按照返回值的真假进行分划(取真时为validation数据集)
split_from_df(col:IntsOrStrs=2)# 使用inner_df的第col列进行分划(取真时为validation数据集)# 这一函数要求ItemList是由from_df()或者from_csv()构建的
3. 生成数据标签

ItemLists实例调用label_from_*函数完成;其返回的是LabelLists实例,该实例由两个LabelList组成;而LabelList类继承自PyTorchDataset类,整合了数据x和标签y(二者均是ItemList类或其子类),并实现了Dataset类所必需的__len__()__getitem__()函数。

label_from_df(cols:IntsOrStrs=1, label_cls:Callable=None, **kwargs)# 由inner_df的第cols列提供标签,cols可以为多列# 这一函数要求ItemList是由from_df()或者from_csv()构建的
label_from_folder(label_cls:Callable=None, **kwargs)# 由文件路径的最后一层的名称指定标签
label_from_func(func:Callable, label_cls:Callable=None, **kwargs)# 由函数提供标签,该函数接受文件名作为参数,返回一个类别
label_from_re(pat:str, full_path:bool=False, label_cls:Callable=None, **kwargs)# 由正则表达式提供标签。
4. 生成模型所需的数据包

LabelLists实例调用databunch()生成,实际上是通过调用DataBunch.create()函数完成的。

二、针对视觉任务的调整 (文档链接)

1. 使用ImageList替换ItemList

ImageListItemList的子类,其主要覆写了对列表进行索引时所需用到的get()函数,即在索引时使用open_image()打开图像。另外,ImageList还覆写了from_df()from_csv()函数,其中会将数据路径与dfcsv中的相对路径拼合成绝对路径。

2. 使用ImageDataBunch替换DataBunch

这一设置其实也是在ImageList中进行的。在ItemList类中,用一个类变量_bunch记录数据包的类DataBunch;而在ImageList中,这一变量的值变为了ImageDataBunchImageDataBunchDataBunch的子类。

三、其他需要注意的地方

1. ItemLists的属性

查询ItemLists的实例属性时,调用的是__getattr__()函数。首先查看self.train的相应属性,若查到的属性不是Callable的,则直接返回;否则,则在self.trainself.valid上分别调用相应属性,并将结果替换self.trainself.valid

事实上,如LabelInstance.classes也是类似的逻辑。

2. 数据预处理

预设的预处理操作是通过ItemList的类属性_processor来设置的。如果在创建ItemList时,指定了实例变量processor,则将覆盖_processor的作用。预处理操作均应为PreProcessor类的实例,该实例主要包含用于处理单条记录的process_one()函数和用于列表处理的process()函数;process()函数将使用预处理后的结果替换掉传入的数据列表。

如对分类问题,在由ItemLists实例调用label_from_*方法(由前所述,该调用实际会在ItemListsInstance.trainItemListsInstance.valid两个ItemList实例上分别调用label_from_*方法)时,会首先判断标签类型为CategoryList,该类继自CategoryListBase;而CategoryListBase继承自ItemList,并且类成员变量_processorCategoryProcessor(ItemList类的_processorNone)。这样,由label_from_*方法生成的LabelList对象的x将为ItemList类,对其进行的预处理将为空;而其y将为CategoryList类,对其进行的预处理将为CategoryProcessor,即将标签中的不同值当做标签集合,并提供标签字面值与索引的映射字典。

四、示例

仍使用fastai.URLs.MNIST_SAMPLEi数据,假设数据所在文件夹为path,则:

data = (ImageList.from_folder(path) # 数据文件的路径.split_by_folder()      # 按比例分割训练集和验证集.label_from_folder()    # 指定类别标签.transform(size=32)     # 对图像进行变换.databunch(bs=128).normalize(imagenet_stats) # 数据归一化
)

假设要从每张图片中预测三个浮点值,数据准备如下:

图 2. 从图片中预测浮点值
则数据包的构造流程为:
il = (ImageList.from_csv(path=path, csv_name="labels_float.csv").split_by_idx(range(20)).label_from_df(cols=[1,2,3], label_cls=FloatList).transform(size=32).databunch(bs=128).normalize(imagenet_stats)
)

其中在做label_from_df()调用时,需要指明Label ClassFloatList类型,否则会默认设置为MultiCategoryList类。

注意,其中均未设置对数据应做哪些变换,这一部分内容将在下一篇博文中介绍。

这篇关于第三篇 FastAI数据构造API的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/750666

相关文章

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

MySQL中的DELETE删除数据及注意事项

《MySQL中的DELETE删除数据及注意事项》MySQL的DELETE语句是数据库操作中不可或缺的一部分,通过合理使用索引、批量删除、避免全表删除、使用TRUNCATE、使用ORDERBY和LIMI... 目录1. 基本语法单表删除2. 高级用法使用子查询删除删除多表3. 性能优化策略使用索引批量删除避免

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE

Linux服务器数据盘移除并重新挂载的全过程

《Linux服务器数据盘移除并重新挂载的全过程》:本文主要介绍在Linux服务器上移除并重新挂载数据盘的整个过程,分为三大步:卸载文件系统、分离磁盘和重新挂载,每一步都有详细的步骤和注意事项,确保... 目录引言第一步:卸载文件系统第二步:分离磁盘第三步:重新挂载引言在 linux 服务器上移除并重新挂p

使用MyBatis TypeHandler实现数据加密与解密的具体方案

《使用MyBatisTypeHandler实现数据加密与解密的具体方案》在我们日常的开发工作中,经常会遇到一些敏感数据需要存储,比如用户的手机号、身份证号、银行卡号等,为了保障数据安全,我们通常会对... 目录1. 核心概念:什么是 TypeHandler?2. 实战场景3. 代码实现步骤步骤 1:定义 E

使用C#导出Excel数据并保存多种格式的完整示例

《使用C#导出Excel数据并保存多种格式的完整示例》在现代企业信息化管理中,Excel已经成为最常用的数据存储和分析工具,从员工信息表、销售数据报表到财务分析表,几乎所有部门都离不开Excel,本文... 目录引言1. 安装 Spire.XLS2. 创建工作簿和填充数据3. 保存为不同格式4. 效果展示5

Python多任务爬虫实现爬取图片和GDP数据

《Python多任务爬虫实现爬取图片和GDP数据》本文主要介绍了基于FastAPI开发Web站点的方法,包括搭建Web服务器、处理图片资源、实现多任务爬虫和数据可视化,同时,还简要介绍了Python爬... 目录一. 基于FastAPI之Web站点开发1. 基于FastAPI搭建Web服务器2. Web服务

MySQL 批量插入的原理和实战方法(快速提升大数据导入效率)

《MySQL批量插入的原理和实战方法(快速提升大数据导入效率)》在日常开发中,我们经常需要将大量数据批量插入到MySQL数据库中,本文将介绍批量插入的原理、实现方法,并结合Python和PyMySQ... 目录一、批量插入的优势二、mysql 表的创建示例三、python 实现批量插入1. 安装 PyMyS

关于MySQL将表中数据删除后多久空间会被释放出来

《关于MySQL将表中数据删除后多久空间会被释放出来》MySQL删除数据后,空间不会立即释放给操作系统,而是会被标记为“可重用”,以供未来插入新数据时使用,只有满足特定条件时,空间才可能真正返还给操作... 目录一、mysql数据删除与空间管理1.1 理解MySQL数据删除原理1.3 执行SQL1.3 使用