首页 > 编程知识 正文

数字1-10各种字体,手写数字图片

时间:2023-05-03 21:19:43 阅读:25603 作者:1471

识别手写的阿拉伯数字对人类来说非常简单,但对程序来说有点复杂。

但是,随着机器学习技术的普及,实现使用10几行代码就能识别手写数字的程序并不困难。 这是因为有太多可以直接使用的机器学习模式,如tensorflow和caffe。 python下面有一个现成的安装包,十几行代码就足够写识别数字的程序了。

但我想做的是,不用第三方库,从零开始,完全自己实现这样的程序。 这是因为通过亲手实现,可以深入了解机器学习的原理。

1模型实现1.1原理

熟悉神经网络回归算法的人可以跳过这一节。

学习了一些基本概念,决定使用回归算法。 首先下载了著名的MNIST数据集。 该数据集有60000个培训样本和10000个测试样本。 由于每个数字图像都是28*28的灰度图像,因此输入可以视为28*28矩阵,也可以视为28*28=784个像素值。

在此定义用于判断图像数字的模型。 每个模型包含每个输入的权重,添加截距,最后合并为一个。 模型公式:

out5=sigmoid (x0 * w0x1* w1……x783 * w 783 bias () () ) ) ) ) ) ) ) )。

从X0到X783有784个输入,从W0到W783有784个权重,bias是常数。 sigmoid函数可以将宽范围的数目按压在(0,1 )的区间内,即,保持恒定。

例如,最好使用该权重和bias的集来判断数字5,在图像为5时输出1,在图像不是5时输出0。 然后,训练的过程是根据每个样本的输入,计算Out5的值和正确的值(0或1 )之差,并根据该差调整权重和bias。 转换表达式时,正在努力使(Out5-正确的值)接近0。 所谓的损失最小。

同样,10个数字需要10套型号,每个判断需要不同的数字。 训练结束后,一个图像来,用这10套模型进行计算。 要说哪个模型的计算结果接近1,你觉得这个图像是哪个数字?

1.2培训

基于上述想法,使用加法器的结构化处理语言(SPL )对实现进行编码。

你不用再找了。 培训模式的所有代码都在这里,没有使用任何第三方库。 试着解析如下。

A1、用光标导入MNIST培训示例。 这是我转换的格式,可以直接通过加法器访问;

A2、定义变量:输入x、权重wei、训练速度v、等;

初始化A3、B3、10组模型(每组784个权重1个bias );

A4、循环取样训练5万个,10型同时训练;

B4、取出标签,也就是这张照片是什么;

B5,计算正确的10个输出,保存在变量y中;

B6,提取该图像的28*28个像素点作为输入,C6将各输入除以255。 这是为了正规化;

B7、x0 * w0 x1 * w1……计算x783 * w783 bias

B8,sigmoid的计算(B7 )

计算B9、B8的偏导数,或称为梯度;

基于B10、C10、B9值循环调整10个模型的参数;

A11、训练结束后,将模型保存到文件中。

1.3测试

测试一下这个模型的成功率吧。 我用SPL写了测试程序:

运行测试后,正确率达到91.1%。 我对这个结果很满意。 只是单层模型,我使用TensorFlow的单层模型得到的正确率也只有91%多。 解析一下代码吧。

A1、导入模型文件;

A2、将模型提取为变量;

A3、计数器初始化(用于计算成功率);

A4,导入MNIST测试样本。 这个文件格式是我转换的;

A5 )循环采集1万个样品进行测试;

B5、取出标签;

B6、清除输入;

B7、取出该图像的28*28个像素点作为输入,各输入除以255是为了归一化;

B8、x0 * w0 x1 * w1……计算x783 * w783 bias

B9,sigmoid的计算(B7 )

B10,得到最大值,即最有可能的数字

B11、对判断为正确的计数器加1;

A12,A13,测试结束,关闭文件,输出正确率。

1.4优化

这里说的优化不是继续提高正确率,而是加快训练速度。 想提高正确率的学生可以尝试这些手段:

1 .添加卷积层

2 .学习速度不是固定值,而是根据训练次数递减

3 .权重初始值不使用全零,使用正态分布

我认为单纯追求正确率没有什么意义。 因为MNIST数据集中有些图像本身存在问题,人工也不一定能看到写了多少数字。 我用加法器显示了几个错误的图像,都写得很不规则。 很难看出下一张图像是2。

这里重要的是,使用并行或集群来加快培训速度。 使用SPL语言实现并行化很简单。 使用fork关键字的话,上面的

代码稍加处理就可以了。

使用了并行之后,训练的时间减少差不多一半,而代码并没有做太多修改。

2 为什么是 SPL 语言?

使用SPL语言在初期可能会有点不适应,用得多了会觉得越来越方便:

1. 支持集合运算,比如例子里用到的784个输入和784个权重的乘法,直接写一个**就可以了,如果使用Java或者C,还要自己实现。

2. 数据的输入输出很方便,可以方便地对文件读写。

3. 调试太方便了,所有变量都直观可见,这一点比python要好用。

4. 可以单步计算,有了改动不用从头重来,Java和C做不到这一点,python虽然可以但也不方便,集算器只要点中相应格执行就可以了。

5. 实现并行和集群很方便,不需要太多的开发工作量。

6. 支持调用和被调用。集算器可以调用第三方java库,Java也可以调用集算器的代码,例如上面的代码就可以被Java调用,实现一个自动填验证码的功能。

这样的编程语言,用在数学计算上,实在是最合适不过了。

相关文件下载:154037421300096d9.rar

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。