torch入门笔记12:数据的预处理

来源:互联网 发布:radius协议认证端口 编辑:程序博客网 时间:2024/06/04 19:32

这一章用实例讲解在正式训练前需要对训练集的处理以及基本操作,请大家从头开始运行itorch

这里写图片描述 
导入两个包,虽然这章没有涉及网络的建立,但是不导入nn这个包的话,数据的读入会出错,具体我也不太清楚,这个是google出来的,我刚开没有导入nn包,导致文件一直无法读取。 
这里写图片描述 
参数为文件的绝对路径,文件的下载我放到了这里(需要2个积分下载,请大家支持下,如果实在没有积分的话,给我发私信,我发你) 
http://download.csdn.net/detail/u010946556/9518759 
这里写图片描述 
压缩包里有两个数据,分别导入trainset和testset 
这里写图片描述 
声明一个classes的数组,用于说明训练集图片所对应的名字,图片总共有10类 
这里写图片描述 
打印下trainset可以看到有10000张图片,3通道,像素是32x32,对应的标签同样有10000个 
这里写图片描述 
为了直观些,可以打印其中的一张照片观看下。 
itorch.image()是用来打印图片,trainset.data[100]表示第100张图片。 
trainset.label[100]表示标签的第100个的标签,注意标签分别是用1到10表示,第100个标签的值是2,对应的classes数组的第2个元素是“汽车” 
这里写图片描述 
为了利用“nn.StochasticGradient”方法来计算权值,数据集的数据必须满足两个条件:1)数据集必须包含size()方法;2)数据集必须有一个索引,即data[i]表示第i个样本的数据。所以为了使数据集满足以上两点,需要使用setmetatable这个函数。这个函数有时间会单独拿出来一章详细讲,这里就先大概知道它就是用来给数据集添加索引的。将ByteTensor 转变成DoubleTensor。声明一个size()函数,用来返回自身数据的size(1) 
这里写图片描述 
trainset.data的张量(Tensor)的结构打印出来如上(想象成4维数组),定义的size()函数就是用来放回size(1),即10000。如果这里不太清楚,插个例子说明下。 
这里写图片描述 
这是一个初始化的张量(Tensor),类似于二维数组,size(1)为3,size(2)为2。 
这里写图片描述 
说了这么多就是让之前的trainset.data[33](存的是图片)和trainset.label[33](存的是图片的标签)所包含的数据转变成trainset[33]这种形式表示。itorch.image()显示对应的图片。 
这里写图片描述 
这是第999张图片对应的数据trainset[999],如果换成print(trainset[999][1])则打印的是具体存的图像的数值数值,如下图 
这里写图片描述


下面需要再插入一段,讲解下张量(Tensor)的索引操作 
这里写图片描述 
张量的索引操作最开始都是用“[{ }]”,里面的是”{ }“。结合到我们这个例子,trainset.data的张量是4维的,分别代表着”第几张图片“, ”图片的通道“,”图片的纵像素“,”图片的横像素“,”{ }“代表选择该维纵所有的元素。对应第13行代码里为,选取全部图片,选取第1个通道,选取所有x轴和一轴方向的像素。 
这里写图片描述 
打印出来为上图结果,注意第二维的值由3变为了1

这里写图片描述 
再如这次选取100到105图片,打印结果为6张图片,1通道(红色),32x32像素


这里写图片描述 
创建两数组,分别用来存平均值,和标准差,这一步是做数据中心化以及归一化操作。通俗地说中心化就是让图片对应的矩阵的各个数值以0为原点上下波动而不是在其他的某个值波动,归一化是为了加快和使算法更好地收敛,为什么归一化可见下图 
这里写图片描述 
假如未归一化,收敛的过程可能是这种情况,要9步才能收敛到最优值 
这里写图片描述 
归一化就是将“椭圆”的数据变得“正圆”,这样收敛的速度会加快。 
详情请看cousera上面Andrew Ng的讲解 
这里写图片描述 
这是一个中心化,归一化的操作,利用for循环完成。 
循环是i从1到3,mean[i]为刚刚创建的数组用于存储求得的每个通道的平均值,注意mean( )是求平均值的方法,不要同mean这个数组搞混了。print( )打印算出的第i个通道的平均值mean[i]。调用add( )方法加上负的mean[i]完成中心化。同样,第二部分,算出第i通道的标准差,打印标准差stdv[i],调用div( )除以stdv[i],完成归一化。当然归一化的方法不是唯一的这里是用到标准差处理,相关的其他算法可以google一下。

至此,已完成了网络模型的建立,训练的基本操作,数据的预处理,下一章是做个总结,完整地实现我们的实例,附上代码。

0 0
原创粉丝点击