字体:大 中 小
护眼
关灯
上一章
目录
下一页
第53章 大功告成 (第1/2页)
不过,在跑代码之前,还要对数据进行预处理。 江寒先从报名信息表中,将性别信息仍然“健在”的行挑出来,只保留序号、姓名和性别,另存为label.xls。 这些记录一共9527条,大约占三万多条数据总数的30%。 它们对应着9527张真彩色照片。 24位真彩色的图片,每个像素点在内存里,要占用3个字节的存储单元。 每张照片有210×120个像素,这样读入一张照片,需要的内存空间就是210×120×3=75600个Byte。 9527条数据,共需要9527×75600=720241200B≈686.88M≈0.7G! 这个内存开销,还是比较容易接受的。 但是,“感知机”的算法,需要进行大量浮点乘法运算。 对每个像素的每个RGB分量都算一遍? 没那个必要,也太浪费时间。 所以,聪明的做法,是先把照片数据“压缩”一下。 江寒给“感知机”的代码,添加了一个LoadData函数,用来读取和处理照片数据。 在这个函数里,先定义一个二维的整形数组Feature。 然后从label.xls中读出序号、姓名信息,按照刚才建立的索引表,找到对应的照片文件。 下一步,将照片读取到内存中,读取的同时,将每个像素二值化。 具体做法是:色彩浓度在阈值以上的像素,取值为1,低于阈值就让它为0。 这样一来,原本的真彩色照片,就被转换成了黑白轮廓图。 然后,再将轮廓图中的0或者1的取值,按照从左到右、从上到下的顺序,重新编排成一行数据,存放到数组Feature中。 Feature中的每一行,都存储了一张照片的二值化信息。 一共9027张照片,就需要9027行。 全部照片处理完毕后,就得到了一个巨大的二维数组Feature。 它有25200列、9027行! 接下来,定义一个拥有9027个整形元素的一维数组Label。 从label.xls中读入性别信息,男生设为1,女生设为0,存放在数组Label中。 Feature加上对应的Label,就构成了训练数据集。 训练“感知机”时,将一行行Feature代入公式中,进行加权和运算,其结果再通过sign函数,转换为0或1,然后和对应的Label值对照。 如果不相符,就调整权重和偏置,然后重新计算。 当每一个Feature代入公式后,都能计算出正确的Label时,就得到了一组权重和偏置。 也就是说,构建出了一个可用的数学模型。 依据这个模型,计算机就可以读入任何一张同尺寸、类型的照片,对其二值化的数据代入模型中运算,并根据运算结果判断分类归属。 这就是典型的机器学习过程,计算机从数据中自己“学”到了某种规律。 即使这种规律,人类并不一定完全理解,也不见得能用数学语言解释清楚…… 剩下的就比较简单了。 接下来,江寒又添加了几个函数,用来输出运算结果、观察运行情况等。 最后,从头调试了一遍,确认没啥bug后,将代码重新编译,然后运行了起来。 屏幕上有一些数字,表示当前正在处理的数据,和训练进度的百分比。 十分钟后,后一个数字才刚刚达到1.3%。 这表示,完整训练一遍,大约需要13个小时…… 之所以这么慢,主要是江寒的程序,比较追求稳定性,以及调试的方便、快捷,并没特别讲究执行效率。 当然,即使他用心优化,估计也需要8个小时以上,才能完成训练。 虽然有点慢,但其实没什么关系,训练过程并不需要人工干预,挂机等着就行。 第二天早晨,江寒起床后,先看了下训练进度,还差了大约13%才能完成,就先去班级上课。
上一章
目录
下一页