aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 19777|回复: 5

人工智能学习心得:根据二维数组生成卷积图二维数据

[复制链接]

34

主题

30

回帖

390

积分

新手入门

积分
390
发表于 2018-2-9 22:39:25 | 显示全部楼层 |阅读模式
根据二维数组生成卷积图二维数组,可以用于研究图形图像识别等.
比如数字2和5的点阵在X轴投影和Y轴投影上是非常相似的,那么分别对它们进行卷积运算后,两者的投影差异就非常大了,因此可以精确识别图形图像.
可以应用在对相似相近图像内容的识别准确度要求非常高的场景,如 证件号码/产品条码 的扫描识别等.

本例的思路是,先对原始传入的二维数组加一圈0,然后用九宫格权重去分别乘9个位置,得到的和作为输出,逐步移动卷积核,逐个输出,最终得到卷积图.
为方便理解,大量使用了中文注释,请见谅.

如,数字2的点阵为:
        1       1       1
        0       0       1
        1       1       1
        1       0       0
        1       1       1

先加一圈0:
        0       0       0       0       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       0       0       0       0

然后对0圈里面的每个点作为中心点去做卷积运算:

hang=2   lie=2
某中心点卷积结果:7
hang=2   lie=3
某中心点卷积结果:16
hang=2   lie=4
某中心点卷积结果:11

hang=3   lie=2
某中心点卷积结果:24
hang=3   lie=3
某中心点卷积结果:42
hang=3   lie=4
某中心点卷积结果:25

hang=4   lie=2
某中心点卷积结果:15
hang=4   lie=3
某中心点卷积结果:23
hang=4   lie=4
某中心点卷积结果:7

hang=5   lie=2
某中心点卷积结果:25
hang=5   lie=3
某中心点卷积结果:38
hang=5   lie=4
某中心点卷积结果:24

hang=6   lie=2
某中心点卷积结果:11
hang=6   lie=3
某中心点卷积结果:12
hang=6   lie=4
某中心点卷积结果:3

得到的卷积图是:
        7       16      11
        24      42      25
        15      23      7
        25      38      24
        11      12      3

运算出来的卷积图也是一个二维数组,可以对它再进行一次卷积操作.

源码:

  1. import console;

  2. var 打印二维数组供观察 = function(tab){
  3.         for(i1=1;table.count(tab);1){
  4.                 var str = ""
  5.                 for(i2=1;table.count(tab[i1]);1){
  6.                         str = str + "        " + tab[i1][i2]
  7.                 }
  8.                 console.log(str)
  9.         }       
  10. }


  11. var 原始二维数组图 = {{1;1;1};{0;0;1};{1;1;1};{1;0;0};{1;1;1};}

  12. 打印二维数组供观察(原始二维数组图)

  13. //是个九宫格,从中宫开始9字形顺时针旋转排序 --- 这个权重数组可以自定义,不同权重组合有不同的效果
  14. var 卷积权重数组 = {3;4;5;2;1;6;9;8;7}

  15. var 生成卷积图二维数组 = function(tab){
  16.         //传入二维数组,生成卷积后的二维数组
  17.        
  18.         //先加一圈0
  19.        
  20.         //给每一行前面和后面加上0
  21.         for(i=1;table.count(tab);1){       
  22.                 table.push(tab[i],0)
  23.                 table.insert(tab[i],0)
  24.         }
  25.        
  26.         var tempShuzhu = {}
  27.         for(i=1;table.count(tab[1]);1){
  28.                 table.push(tempShuzhu,0)
  29.         }
  30.        
  31.         //在后面加一行全0的数组
  32.         table.push(tab,tempShuzhu)
  33.        
  34.         //在前面加一行全0的数组
  35.         table.insert(tab,tempShuzhu)
  36.        
  37.         console.log("生成卷积图二维数组,加了一圈0:")
  38.         打印二维数组供观察(tab)
  39.        
  40.         var 卷积图二维数组 = {}
  41.         //逐个九宫区块乘以卷积权重数组输出到二维数组
  42.         for(hang=2;table.count(tab)-1;1){//因为了加一圈零,从第2行第2列起才是原图的起点
  43.                
  44.                 table.push(卷积图二维数组,{})//添加个子数组
  45.                
  46.                 for(lie=2;table.count(tab[hang])-1;1){
  47.                         console.log("hang="+hang," lie="+lie)
  48.                        
  49.                         //原图中的第1个点作为中心点,与周边八个点逐个与卷积数组相乘,计出一个卷积位
  50.                         var 某中心点卷积结果;
  51.                        
  52.                        
  53.                         /*因为是从第2行第2列为中心点算起*/
  54.                         某中心点卷积结果 =    tab[hang-1][lie-1]*3 + tab[hang-1][lie]*4 + tab[hang-1][lie+1]*5
  55.                                                                 + tab[hang][lie-1]*2 + tab[hang][lie]*1 + tab[hang][lie+1]*6
  56.                                                                 + tab[hang+1][lie-1]*9 + tab[hang+1][lie]*8 + tab[hang+1][lie+1]*7
  57.                        
  58.                         console.log("某中心点卷积结果:"+某中心点卷积结果)
  59.                        
  60.                         //不能更新到原数组的同一个位置,不然卷积九宫格移动时会计算新数据
  61.                        
  62.                         table.push(卷积图二维数组[hang-1],某中心点卷积结果)
  63.                        
  64.                 }
  65.                 console.log('\r\n')
  66.         }
  67.        
  68.         打印二维数组供观察(卷积图二维数组)
  69.         //console.dumpJson(tab)
  70.         console.log("------------------------------------------")
  71.         return 卷积图二维数组;
  72. }

  73. var 第一次卷积后数组 = 生成卷积图二维数组(原始二维数组图)
  74. var 第二次卷积后数组 = 生成卷积图二维数组(第一次卷积后数组)

  75. console.log("您输入的是" ,num );
  76. console.pause(true);
复制代码


建议把此卷积运算函数收进table库,传入二维数组和权重数组,返回卷积后的二维数组

2

主题

14

回帖

121

积分

一级会员

积分
121
发表于 2018-2-10 09:52:05 | 显示全部楼层
看不懂,但觉得很牛B.特来膜拜.

人工智能还是要深入学习下

38

主题

129

回帖

1045

积分

荣誉会员

积分
1045
发表于 2018-2-10 12:00:29 | 显示全部楼层
屌,前来学习

3

主题

17

回帖

220

积分

二级会员

积分
220
发表于 2018-2-22 13:08:59 | 显示全部楼层
不明觉厉,继续学习。。。
不明觉厉,继续学习。。。

1

主题

12

回帖

124

积分

一级会员

积分
124
发表于 2018-3-10 18:55:16 | 显示全部楼层
不明觉厉,楼主有空有可以移植一个数值运算的库,把常用的微分,积分,函数拟合等做进去。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2024-4-15 04:47 , Processed in 0.054397 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2023 Tencent Cloud.

快速回复 返回顶部 返回列表