1. PyTorch第六讲--Dataset和DataLoader
前面五讲都是开胃菜,都是基础中的基础,就好比是带领你学习了数学中加减乘除这几个运算符,仅仅只是学习了这几个运算符而已。从这一讲开始将进入编写深度学习代码阶段。在第一讲深度学习的七步法中,我将深度学习代码的模版拆解成七步。本小节将讲解七步中的第一步 Dataset 和第二步 DataLoader,这两步都是关于数据相关的内容。
Dataset 分为2种:PyTorch 内置的数据集和自己自定义的数据集,使用起来有所区别。因为Dataset 和 DataLoader 使用起来不分家,下面介绍的时候,分别按照数据集类别讲解不同数据集时如何使用。
内置的数据集有3种:FashionMNIST,ImageNet等。深度学习核心的内容不在数据读取封装这儿,找个实例,弄明白几个关键地方就足够了。自定义数据集,这个要重点看一下,论文复现时,数据集通常都需要自己写程序加载。
第一步:可视化(可选,但非常建议)。如果你非常熟悉数据集,那可以忽略。如果不熟悉,非常建议可视化一下数据,看看数据集概况。
第二步:加载内置的 Dataset。以 FashionMNIST 数据集为例。直接上代码,先看代码,然后拆解知识点。理解更深之后,第一步的 Dataset 类中有个 transform 参数,更深理解之后,你可能会自己书写 transform 函数。比如,你的任务有PyTorch 内置的数据集,但是使用方式不一样,此时就需要自己写 transform 函数。
对于 NLP任务,通常会用 transform 进行 tokenizer。
第三步:DataLoader。DataLoader 的输入是 Dataset,将数据集封装成迭代器,提供的功能有:按照 batch 读取、采样、shuffle、多线程读取等。没什么好说的,例子如下。没见过的参数,查 DataLoader 官方的 doc 就行。用的时候再查,应该把精力放在重点核心内容,重点核心内容要能手写,其他的边边角角非重点,用的时候再查就可以了。
使用时有4个关键属性:num_workers,collate_fn 函数。
num_workers 用于多进程读取数据。注意,这个属性会导致内存占用过多,因为每个 num_workder 会复制父进程的资源,建议是将 Python object 转换成 Pandas、Numpy、PyArrow 等对象。使用的时候,参考: DataLoader num_workers > 0 causes CPU memory from parent process to be replicated in all worker processes · Issue #13246 · pytorch/pytorch (github.com)
collate_fn 函数:用于定制化batch的输出。详解torch中的collate_fn参数 - 知乎 (hu.com) 在dataloader构建的时侯,collate_fn一般是不用特殊指明的,因为默认的方法会将数据组织成我们想要的方式。但是如果想定制**batch的输出形式的话,这个参数就非常重要了。比如在3D目标检测中,我们的batch形式希望是pointcloud_batch,gt_boxes_batch这种形式的时侯。**通常,如果自定义数据集读取的话,这个参数是一定要设置的。如果不设置,数据会分封装成 tuple,形如 [(data1, label1), (data2, label2), (data3, label3), ......],通常我们希望的格式是 (data1, data2, data3); (label1, label2, label3).
实战:NLP任务的典型处理过程。上面的例子只是为了让你掌握这个处理流程,无论怎么变,这三个流程都不会变。但具体使用的时候,细节可能会不一样,尤其是上面的 transform 步骤。下面我们再来看一个例子,如果你是做NLP的,这个例子应该被熟练掌握。
第一步:可视化。第二步:Dataset。NLP任务,通常在这一步需要完成:第三步:DataLoader。上面留了学习 collate_fn 函数的作业,这里我们详细讲解一下这个函数。collate_fn 的输入是:DataLoader 的一个batch;collate_fn 的功能是:依据定义的collate_fn函数对batch data 进行处理;划重点:collate_fn 要定义在最外层,因为DataLoader可能会多线程处理,定义在最外层可以确保每个线程都能访问这个函数。
自定义数据集。数据集的2种类别:map-style dataset 和 Iterable-style datasets。map-style dataset 的特点是:使用时通过 indices 或者 keys 获取数据。Iterable-style datasets 的使用场景是:当随机访问代价比较大或者压根不可能随机访问时使用。通常我们的数据集都是 Map-style dataset。这里我们学习如何自定义数据集加载过程也是以 Dataset 为例。自定义数据集,更多例子参考: Writing Custom Datasets, DataLoaders and Transforms — PyTorch Tutorials 1.13.1+cu117 documentation。
第一步:自定义dataset类,并实现3个方法:第二步:封装成 dataloader,用于 batch 化。第三步:iterate,并可视化。iterate 在 train 函数会使用,每次 iterate 都会对应一个 epoch 过程。如果想进一步控制每次iterate时数据的次序,可以参考 Samplers。
Transforms。很多时候,数据集不能直接满足训练的输入要求,需要进行一些转换。transform 用于修改 feature 和label,使数据满足训练的输入要求。在 “内置的数据集”章节中我们讲解过 transform 参数。如果我们的数据转换操作比较简单,可以像上面一样,书写一个函数。如果我们的场景需要组合多种数据转换操作,这个时候需要使用 transforms.Compose 进行封装。例子如下。
All TorchVision datasets have two parameters -transform to modify the features and target_transform to modify the labels - that accept callables containing the transformation logic. The torchvision.transforms mole offers several commonly-used transforms out of the box.
链接给了,自学:实践教程|源码级理解Pytorch中的Dataset和DataLoader (qq.com)
实践技巧。链接给了,自学:pytorch的dataloader如何读取变长数据 - 知乎 (hu.com); pytorch dataloader数据加载占用了大部分时间,各位大佬都是怎么解决的? - 知乎 (hu.com)
实战。中午午休时间,看着办公室很多人都在睡觉,也有人在默默看电脑,忽然想到这个系列是为了从零到一学会复现任何一篇Paper。既然是从零到一复现论文,那么真刀真枪找个项目来干一下。这里我们选择 codertimo/BERT-pytorch: Google AI 2018 BERT pytorch implementation (github.com) 仓库,验证一下我们刚才学习的。具体看的过程只能你自己去看了,或者等我出视频的时候,带领你一起读源码,Bert非常重要,一定要熟练掌握,要能背下来。你之所以觉得一些大佬牛逼,无他,手熟尔,他在夜深人静时,一定在反复看源码。
2. delphi 如何通过Tdataset数据集 获取数据库列名 以及列数。
1、数据库列数可以用 TDATASET的FieldCount属性获得。
2、数据库列名可以做一个循环得到,例如:
var
i:integer
begin
for i := 0 to Table1.FieldCount-1 do
showmessage(Table1.Fields[i].FieldName);
end;
3. 如何取DataSet第一个表中第一行一列的数据
代码如下:
private void button1_Click(object sender, EventArgs e)
{
//假定目前dataset里只有一个表
DataTable dt = ds.Tables[0];
string textname = "tn";//必须保证有这行
DataRow dr = dt.Select("text='{0}'", textname)[0];
string suibe = dr[2].ToString();
//或者
string suibe1 = dr["suibe"].ToString();
//现在是给textbox赋值
//其他列类似操作
}
(3)怎么用dataset获取数据扩展阅读
DataSet用法详细
一、特点介绍
1、处理脱机数据,在多层应用程序中很有用。
2、可以在任何时候查看DataSet中任意行的内容,允许修改查询结果的方法。
3、处理分级数据
4、缓存更改
5、XML的完整性:DataSet对象和XML文档几乎是可互换的。
二、使用介绍
1、创建DataSet对象:
DataSetds = new DataSet("DataSetName");
2、查看调用SqlDataAdapter.Fill创建的结构
da.Fill(ds,"Orders");
DataTabletbl = ds.Table[0];
foreach(DataColumncol in tbl.Columns)
Console.WriteLine(col.ColumnName);