笔者只想带领大家做一个有关 25张小纸片 的小游戏。
请准备纸片,其实不准备也ok1 手工题
现有25张正方形的小纸片,纸片一面涂成黑色,一面保持白色。请用这些小纸片依次摆出 0 ~ 9这10个数字,你能做到么?
看看笔者的答案你的是否一致👇
用黑白小纸片摆出10个数字2 表示题
接下来,我们希望用一组数字来表示 0 ~ 9 这10个数字,你会怎么做呢?
比如,我们可以:将黑色定义为0,白色定义为1👇
用0、1来表示黑白色块那么摆出的数字0即可表示为:01110 01010 01010 01010 01110
数字0图片表示为0/1数字串同理,其他的数字也可以用 0/1 数字串表示,我们即得到0 ~ 9这10个数字的数据表示:
0 = 01110 01010 01010 01010 01110
1 = 00100 01100 00100 00100 01110
2 = 01110 00010 01110 01000 01110
3 = 01110 00010 01110 00010 01110
4 = 01010 01010 01110 00010 00010
5 = 01110 01000 01110 00010 01110
6 = 01110 01000 01110 01010 01110
7 = 01110 00010 00010 00010 00010
8 = 01110 01010 01110 01010 01110
9 = 01110 01010 01110 00010 01110
3 算法体验
我们期望设计一种算法:
输入一个数字的数据,得到这个输入为0 ~ 9 这10个数字的可能性。
那么,算法笔者已经设计好啦,我们通过体验来认识一下Ta!
3.1 向算法输入数字0的数据
3.1.1输出0的可能性
计算0的可能性1)将「输入」与「输出」中的0进行连线,并将「连线」的25个值赋值为数字0的25个值;
2)将「输入」与「连线」的值中的“0”变换为“-1“;
3)将「输入」与「连线」的值分别相乘,然后结果相加;
4) 得到的25即为输入为数字0的可能性。(数字越大表示可能性越高)
3.1.2 输出其他数字的可能性
计算每个数字的输出可能性我们得到,算法认为,输入数据为1 ~ 9 的可能性分别为:5,19,19,15,19,21,15,23,21,都没有为0的可能性(25)高,故算法认为识别结果为数字0。
而我们的输入正是数字0的数据,bingo!
3.2 向算法输入其他数字(1 ~ 9)的数据
我们再将1 ~ 9 的数字输入作为输入进行运算呢?算了,把0也放在一起看吧!
(说明:输入改变,连线的值不变)
输入0得到:[25,5,19,19,15,19,21,15,23,21]
输入1得到:[5, 25, 7, 7, 3, 11, 9, 3, 7, 9]
输入2得到:[19, 7, 25, 21, 13, 17, 19, 13, 21, 19]
输入3得到:[19, 7, 21, 25, 17, 21, 19, 17, 21, 23]
输入4得到:[15, 3, 13, 17, 25, 17, 15, 17, 17, 19]
输入5得到:[19, 11, 17, 21, 17, 25, 23, 13, 21, 23]
输入6得到:[21, 9, 19, 19, 15, 23, 25, 11, 23, 21]
输入7得到:[15, 3, 13, 17, 17, 13, 11, 25, 13, 15]
输入8得到:[23, 7, 21, 21, 17, 21, 23, 13, 25, 23]
输入9得到:[21, 9, 19, 23, 19, 23, 21, 15, 23, 25]
发现了么?我们的算法每次都能将输入的数字正确识别哎!(比如输入4的数据,算法输出结果的最大值得为之即为4,位置记得从0计起哦)
看似算法很理想,但是……
3.3 识别非标准数字(其他图片)
但是,25张小纸片,我们或许可以做出更有趣的组合👇
魂淡,好特殊的组合我们将其转为数据,即为:
组合1:1,1,1,0,0, 1,0,0,0,0, 1,1,1,0,0, 0,0,1,0,0, 1,1,1,0,0
组合2:0,1,1,1,0, 0,1,0,0,0, 0,1,1,1,0, 0,0,0,1,0, 0,1,1,0,0
组合3:0,0,1,1,0, 0,1,0,0,0, 0,1,1,1,0, 0,0,0,1,0, 0,1,1,1,0
输入算法得到发输出(它们为10种数字的概率值),得到:
输入组合1结果:[-1, 7, 5, 5, -3, 5, 3, -3, 1, 3]
输入组合2结果:[17, 9, 15, 19, 15, 23, 21, 11, 19, 21]
输入组合3结果:[17, 13, 15, 19, 15, 23, 21, 11, 19, 21]
算法认为三个组合的数字分别为:1、5、5
但我们看来他们似乎更应该是5、5、5。
那么,三个组合,算法只答对了2个。
4 这就是神经网络
-
网络
诺,上面的算法就是一个拥有一个全连接层(Full Connect) 的一层神经网络; -
参数(权重)
计算需要的25 * 10 条连线所代表的值即构成了网络的参数,或说权重。 -
模型
网络+参数,即构成一个我们常说的神经网络模型。 -
训练集、测试集、识别率
原始的10张标准图片即可理解为训练集,给出的3张特殊图片可理解为测试集,训练过程即为为参数(线条)赋值的过程,当然……该例的训练过程为笔者的”人工“智能。我们发现,笔者的“人工”训练对训练集特别友好,达到100%的识别率!但测试集的识别率就不太理想了,只有66.7%。 -
分类问题
该例中,我们进行“数字识别“,但其也可以理解为一个图片分类问题。想象一下,我们输入一批这样的图片,我们的算法是不是可以将其分为0 ~ 9这10种类别,对不对!
看到这里,或许你对神经网络有了一个基本的认识,又或许引发了更多的问题:
- 神经网络的训练是怎么回事?都是像笔者这样“人工”智能给权重么?
- 我们常常听到的神经网络卷积操作是什么?为啥完全没有介绍?
- 神经网络的识别率怎样提高?
- 好像还有很多很多问题,但暂时都不知道怎么问出来……
太棒了!提出问题并解决就是进步。这些问题我们之后会慢慢解决~
后记:懒惰的作者
文章过程中给出了大量数据的计算结果,难道都是笔者自己一个个手算的么?NONO,作为一个懒到不行的存在,笔者只不过在一段python代码中改几个数字而已啦~
import numpy as np
values = np.array(\
[[0,1,1,1,0, 0,1,0,1,0, 0,1,0,1,0, 0,1,0,1,0, 0,1,1,1,0],\
[0,0,1,0,0, 0,1,1,0,0, 0,0,1,0,0, 0,0,1,0,0, 0,1,1,1,0],\
[0,1,1,1,0, 0,0,0,1,0, 0,1,1,1,0, 0,1,0,0,0, 0,1,1,1,0],\
[0,1,1,1,0, 0,0,0,1,0, 0,1,1,1,0, 0,0,0,1,0, 0,1,1,1,0],\
[0,1,0,1,0, 0,1,0,1,0, 0,1,1,1,0, 0,0,0,1,0, 0,0,0,1,0],\
[0,1,1,1,0, 0,1,0,0,0, 0,1,1,1,0, 0,0,0,1,0, 0,1,1,1,0],\
[0,1,1,1,0, 0,1,0,0,0, 0,1,1,1,0, 0,1,0,1,0, 0,1,1,1,0],\
[0,1,1,1,0, 0,0,0,1,0, 0,0,0,1,0, 0,0,0,1,0, 0,0,0,1,0],\
[0,1,1,1,0, 0,1,0,1,0, 0,1,1,1,0, 0,1,0,1,0, 0,1,1,1,0],\
[0,1,1,1,0, 0,1,0,1,0, 0,1,1,1,0, 0,0,0,1,0, 0,1,1,1,0]])
spInput = np.array(\
[[1,1,1,0,0, 1,0,0,0,0, 1,1,1,0,0, 0,0,1,0,0, 1,1,1,0,0],\
[0,1,1,1,0, 0,1,0,0,0, 0,1,1,1,0, 0,0,0,1,0, 0,1,1,0,0],\
[0,0,1,1,0, 0,1,0,0,0, 0,1,1,1,0, 0,0,0,1,0, 0,1,1,1,0]])
result = []
for i in range(10):
# v0 = values[9] * 2 - 1;
v0 = spInput[2] * 2 - 1;
v1 = values[i] * 2 - 1;
ms = np.sum(v0 * v1);
result.append(ms);
print(result)
看不懂?百度百度加加油,将AI拉下神坛,有些努力还是要自己付出的哦~~
未来更精彩
如果你觉得本篇对你有帮助,请关注接下来的篇章吧,笔者会带领大家 训练 并 使用 一个真实可用的手写数字识别模型。你要做的只是 配置好一个python的运行环境。不需要服务器,不需要GPU,数据、代码都交给笔者就好啦。
关注后续的篇章吧,随笔者一起将AI拉下神坛!
网友评论