仅用200个样本就能得到当前最佳结果:手写字符识别新模型TextCaps
由于深度学习近期取得的进展,手写字符识别任务对一些主流语言来说已然不是什么难题了。但是对于一些训练样本较少的非主流语言来说,这仍是一个挑战性问题。为此,本文提出新模型TextCaps,它每类仅用200个训练样本就能达到和当前最佳水平媲美的结果。
由于深度学习模型近期取得的进展,对于许多主流语言来说,手写字符识别已经是得到解决的问题了。但对于其它语言而言,由于缺乏足够大的、用来训练深度学习模型的标注数据集,这仍然是一个极具挑战性的问题。
尽管 CNN 可以很好地理解图片中的低级和高级特征,但这样做会在池化层上丢失有价值的信息。CNN 的训练需要大量训练样本(一般每一类需要数千或数万个样本)才能成功地对图像分类。因此人们对用少量训练样本训练成功的 CNN 有着浓厚兴趣。
本文提出了一种技术,它借助胶囊网络(Capsule Networks,CapsNets)[4] 解决了标注数据集太小的问题。我们仅通过操纵实例化参数 [5],利用了 CapsNet 增强数据的能力。在本文的例子中,CapsNet 不仅识别了字符图像,还学习了它的属性。这让 CapsNet 得以在标注数据很少的字符识别问题中大展拳脚。
本文的架构以 Sabour 等人提出的 CapsNet 架构 [4] 为基础,该架构是由胶囊网络和全连接解码器网络组成的。研究人员用(deconvolutional network)代替了解码器网络,同时还对胶囊网络做了一些小改动。
通过给表征实体属性的实例化参数加入一些可控噪声,研究人员转换实体以表征现实中发生的实际变化。这样就产生了一种全新的数据生成技术,这种技术生成的数据会比基于仿射变换生成的增强数据更加逼真。
重建准确率在很多情况下也很重要,因此研究人员提出了一种从经验上讲很合适的策略,这种策略结合了可以显著提升重建性能的损失函数。该系统在每类样本只有 200 个数据点的情况下得到了和当前最佳结果相当的结果。如果用更多训练数据,可以得到更好的结果。
本文的主要贡献如下:
在所有可用训练样本上训练该系统后,在 EMNIST-letters、EMNIST-balanced 以及 EMNIST-digits 字符数据集上得到的结果都优于当前最佳结果;
研究人员还在非字符数据集 Fashion-MNIST 上评估了该架构,以确保模型的灵活性和鲁棒性。他们用 200 个训练样本得到了非常好的结果,并用完整的数据集得到了当前最佳的结果;
研究人员提出了一种用少量训练样本(每一类 200 个数据)训练胶囊网络的新技术,并在相同数量的测试样本上实现了当前最佳的性能。和当前最佳的系统相比,我们的模型只需要 10% 的数据就可以得到类似的结果;
研究人员还提出并评估了解码器网络的几个变体,用不同的损失函数分析了解码器网络的性能,以提供组合损失函数的适当策略。
论文:TextCaps : Handwritten Character Recognition with Very Small Datasets
论文地址:https://arxiv.org/pdf/1904.08095.pdf
摘要:尽管字符识别系统进展很快,但由于缺乏大量有标注的训练数据,很多本地化语言还是难以从中获益。这是因为这样的语言难以获得大量标注数据,而深度学习还无法通过少量训练样本正确学习。
为了解决这个问题,我们引入了一种根据现有样本生成新训练样本的技术。通过给相应的实例化参数添加随机可控噪声,这个新技术可以产生逼真的增强数据,这些增强数据也会反映出人类实际手写字符时会出现的一些变化。
我们只用每类 200 个训练样本的数据进行训练,就得到了超越基于 EMNIST-letter 数据集所获的现有字符识别的结果,同时还获得了与 EMNIST-balanced 、EMNIST-digits 以及 MNIST 这三个数据集相当的现有结果。
我们还开发了一种用损失函数组合有效改善重建能力的策略。我们的系统在缺乏大量标注训练数据的本地化语言的字符识别任务中很有用,甚至在其它相关的通用内容(比如目标识别)上也是如此。
用胶囊网络进行字符识别
我们提出了一种由胶囊网络和解码器网络组成且针对字符识别任务的架构,如图 1 和图 2 所示。
图 1:TextCap 模型:用于字符分类的 CapsNet 模型。
图 2:TextCap 解码器:用于字符重建的解码器网络。通过屏蔽 TextCap 分类器的 DigitCaps 层来获得网络的输入。
基于实例化参数扰动的图像数据生成技术
用预训练的解码器网络,我们可以只用实例化参数向量成功重建原始图像。该扰动算法背后的原理是,通过在实例化向量值中添加可控的随机噪声,我们可以创建和原始图像迥然不同的新图像,从而有效扩大训练数据集。
图 3 展示了改变一个特定实例化参数后产生的图像变体。
图 3:扰动实例化参数后产生的字符变体。
类似地,每一个实例化参数都分别或共同负责图像的某个特定属性。因此,我们提出了一种新技术,它可以根据训练样本有限的数据集产生新数据集,如图 4 所示。
图 4:提升解码器性能的整体方法。
实验和结果
我们从表 1 中每个数据集的训练集中选取了 200 个训练样本来训练 TextCaps,并用每个数据集的完整测试集进行测试。为了测试 TextCaps 架构的性能,我们还用完整的训练集训练了模型,并用完整的测试集进行测试。
表 1:用于评估 TextCaps 的五个数据集。
表 2:TextCaps 和当前最佳结果的比较,表中展示了 3 次试验的平均值和标准差。
表 3:使用不同的损失函数组合时产生的每个重建结果的 PSNR 值。我们在这里用了两个解码器网络模型,每个解码器都有一个损失函数。对每一个损失函数组合来说,第一行的 PSNR 值对应第一个重建损失函数(用在第一个解码器中),第二行对应的是第二个损失函数(用在第二个解码器中)。
原文链接:https://arxiv.org/abs/1904.08095
仅用200个样本就能得到当前最佳结果:手写字符识别新模型TextCaps的更多相关文章
- 使用caffemodel模型(由mnist训练)测试单张手写数字样本
caffe中训练和测试mnist数据集都是批处理,可以反馈识别率,但是看不到单张样本的识别效果,这里使用windows自带的画图工具手写制作0~9的测试数字,然后使用caffemodel模型识别. 1 ...
- 小游戏:200行python代码手写2048
#-*- coding: utf-8 -*- import curses from random import randrange, choice from collections import de ...
- 不使用tomcat,仅适用javaSE手写服务器--模拟登陆
1.搭建框架 我们只是简单模拟,框架简单分三个模块 a,服务器端server包 b,servlet,根据不同的请求url,利用反射生产对应的servlet c,IO工具包,用来关闭IO流 d,编写we ...
- 史上最简单的手写Promise,仅17行代码即可实现Promise链式调用
Promise的使用相比大家已经孰能生巧了,我这里就不赘述了 先说说我写的Promise的问题吧,无法实现宏任务和微任务里的正确执行(也就是在Promise里面写setTimeout,setInter ...
- AI学习---数据IO操作&神经网络基础
数据IO操作 TF支持3种文件读取: 1.直接把数据保存到变量中 2.占位符配合feed_dict使用 3. QueueRunner(TF中特有的) 文件读取流程 文件读取流程(多线 ...
- 深度学习论文翻译解析(五):Siamese Neural Networks for One-shot Image Recognition
论文标题:Siamese Neural Networks for One-shot Image Recognition 论文作者: Gregory Koch Richard Zemel Rusla ...
- Deep-Learning-with-Python] 文本序列中的深度学习
https://blog.csdn.net/LSG_Down/article/details/81327072 将文本数据处理成有用的数据表示 循环神经网络 使用1D卷积处理序列数据 深度学习模型可以 ...
- 支持向量机通俗导论(理解SVM的三层境界)
原文链接:http://blog.csdn.net/v_july_v/article/details/7624837 作者:July.pluskid :致谢:白石.JerryLead 出处:结构之法算 ...
- Python之路【第二十四篇】:Python学习路径及练手项目合集
Python学习路径及练手项目合集 Wayne Shi· 2 个月前 参照:https://zhuanlan.zhihu.com/p/23561159 更多文章欢迎关注专栏:学习编程. 本系列Py ...
随机推荐
- CSS中网格布局实战(初级)
大家好,网格布局是我们在网页布局中经常用到的,那这里我就给大家分享一篇简单的网格布局,让大家能简单明了的了解网格布局的基本内容.闲话不多说,直接进入主题! 第一步,基本的框架结构.这里直接一个div来 ...
- string类应用举例
* Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhello ...
- USB小白学习之路(8)FX2LP cy7c68013A——Slave FIFO 与FPGA通信(转)
此博客转自CSDN:http://blog.csdn.net/xx116213/article/details/50535682 这个博客只对自己理解CY7C68013的配置有一定的帮助,对于配置CY ...
- sublime 安装Anaconda插件 配置python开发环境
我的sublime 3 python 3.6.6 安装Anaconda插件 由于Anaconda插件本身无法知道Python安装的路径,所以需要设置Python主程序的实际位置.选择Settings ...
- 成长日记(2) Java面向对象
本篇主要是记录自己在学习路上的笔记,如果有哪里记错了请大家直接指出 面向对象的概念 *人为抽象的一种编程模型 *面向过程 代码集中 难以维护 *类:对事物 算法 逻辑 概念等的抽象 理解成 模板 图纸 ...
- 如何提高码农产量,基于java的web快速开发平台之自定义表单开发随笔
老板 :下班前一定写完? 程序猿:可以,下班前能一定给! 第二天早上上班~~~ 老板:这都第二天了,怎么没写完? 程序猿:我还没有下班呢! 哎!程序猿的痛啊 公司上线的项目有不少销售记录表,又是报价单 ...
- sql-- 找到重复数据并删除、有重复数据不插入或更新的处理方法
表结构: 需求:找到相同的内容并删除 方法1: 通过分组找出筛选出count大于1的数据 group by可以利用聚合函数(count. sum. avg)进行分组 having 对分组的数据进行下一 ...
- .ArrayList是如何实现的,ArrayList和LinkedList的区别?ArrayList如何实现扩容?
ArrayList比较简单,主要是通过数组来实现的 需要注意的是其初始容量是10 /** * Default initial capacity. */ private static final int ...
- 微信小程序状态管理工具 JStore
微信小程序状态管理工具 JStore 闲着没事做,就想着给微信小程序写一个状态管理工具,名叫 JStore,这个状态管理工具是仿照 vuex 的几个方法来写的,所以有 vuex 的基础同学很容易理解. ...
- py装饰器,生成器,迭代器
emmmmm....看了好久才能大概的看懂一点关于装饰器的内容...import sys # 引入sys模块import timeimport functoolsfrom functools impo ...