美文网首页
将AI拉下神坛(一):黑白纸片摆出的神经网络

将AI拉下神坛(一):黑白纸片摆出的神经网络

作者: Chriszzzz | 来源:发表于2020-05-19 20:02 被阅读0次

    笔者只想带领大家做一个有关 25张小纸片 的小游戏。

    请准备纸片,其实不准备也ok

    1 手工题

    现有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)将「输入」「连线」的值分别相乘,然后结果相加;

    输入为数字0的可能性计算

    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拉下神坛!

    相关文章

      网友评论

          本文标题:将AI拉下神坛(一):黑白纸片摆出的神经网络

          本文链接:https://www.haomeiwen.com/subject/zmpvohtx.html