Quickdraw的CNN-RNN模型《猜小歌》中使用的quickdraw模型本质上是一个分类模型。输入是笔画点的坐标信息和每一笔画的起点。原始识别信息,应用多个级联的一维卷积,然后使用BiLSTM层对结果求和,最后使用Softmax层进行分类。整个网络结构如图所示:模型结构的开源数据和代码详见以下参考文档。整个网络比较简单,在默认参数的情况下,最终模型准确率为75%,如下图,算不上要求高的场景,但是效果已经足够好了。下面是笔者注意到的几个有趣的细节(某高手拍的)。小细节数据预处理对于stroke-3(x,y,n),谷歌默认使用的TFRecord数据对坐标进行归一化和差分处理。#1.Sizenormalization.lower=np.min(np_ink[:,0:2],axis=0)upper=np.max(np_ink[:,0:2],axis=0)scale=upper-lowerscale[scale==0]=1np_ink[:,0:2]=(np_ink[:,0:2]-更低)/scale#2.Computedeltas.np_ink[1:,0:2]-=np_ink[0:-1,0:2]np_ink=np_ink[1:,:]为什么归一化?类似于输入层BN的作用,将数据的分布从原来激活函数的收敛区域调整到梯度较大的区域,只关心画出的笔画的趋势,而不管大小画,也就是说在输入数据层面画大圆和画小圆没有太大区别。为什么要处理差异?忽略起始坐标位置的影响,也就是说在画布的中间和四个边的第一个角开始绘制相同的形状,在输入数据层面上没有太大区别。卷积层使用多个一维卷积(conv1d)级联,并使用线性激活函数而不使用池化层。线性激活改为relu,准确率略有下降,为73%。线性激活改为relu+加一个池化层(size=4,strides=4),准确率下降了一点,降到了70%。为什么linearactivation和removepooling层的效果提升了2-3个点?pooling层的作用是什么:减少参数量,实际上pooling层的增加将训练时间缩短了一半以上;保持特征的局部不变性,看来我们的输入不是复杂的图像像素信息,而是笔划信息,经过差分处理后,局部不变性就没有太大必要了;减少冗余和消除噪音对于简笔画可能不是特别有效。作者(简单)的理解是,简笔画已经是人类对物体的高度抽象了,所以不需要再用复杂的CNN网络来抽象特征,全局特征由后续的RNN层获取。小思谷歌在2016年11月推出了QuickDraw网页版,最近借助一款小程序再次火爆起来。之前获取了大量真实的用户数据,用来优化这个小程序的效果。该模型还能用于什么?最近看到一篇文章,研究了不同国家的人在这个简笔画数据中的绘制顺序和他们的民族性格之间的关系,时间序列分类模型被用在了异常分析、手写识别、语音识别和文本分类中。这方面有很多研究和进展。画圈的区别作者曾在研究生阶段研究过计算机用户的异常分析,根据用户鼠标轨迹和键盘操作的特点建立了分类模型来识别用户是否在操作。现在想来,直接用这个模型跑之前的任务应该也不错。在产品层面,我们可以有哪些创新?AutoDraw:可以自动将你的涂鸦升华成精美的艺术图像(谷歌已经推出)绘图故事:画4幅漫画,系统会自动生成故事(这个应该配合上层NLG技术问题不大)绘画评分:自动对您的画作的创新性、技术性、完整性等进行评分。这些绘画数据还能挖掘出什么其他价值?从一个简单的简笔画开始,可以了解人们如何理解物体和世界。简单来说,就是可以迁移到当前图像识别算法的高层抽象阶段,提升某些任务的效果;如果再复杂一些,甚至可以用来提高机器的推理能力。能够学习人类对物体和世界进行抽象建模的能力(脑洞大开)。
