基于CNN的增量学习论文的读后感

最近在阅读几篇基于CNN的增量学习的论文。

《INCREMENTAL LEARNING WITH PRE-TRAINED CONVOLUTIONAL NEURAL NETWORKS AND BINARY ASSOCIATIVE MEMORIES》

09-19 阅读

第一篇论文是《INCREMENTAL LEARNING WITH PRE-TRAINED CONVOLUTIONAL NEURAL NETWORKS AND BINARY ASSOCIATIVE MEMORIES》,这篇论文的实现思路算是比较简单,利用预训练的CNN作为特征提取器,然后使用PQ对特征编码,然后使用 Binary associative memories 进行存储和分类。

首先是介绍了增量学习的四个定义:
1. 新样本可以学习新的信息;
2. 不需要旧的数据,减少内存使用;
3. 保留学过的信息,避免灾变性失忆;
4. 适应新类别数据。

而过去的工作主要使用的方法有:
1. 为新的数据训练新的分类器,比如 learn++方法;
2. 加入新数据后训练旧模型得到新的模型;
3. 结合SVMs和learn++的“SVMlearn++”方法,但每次有新数据仍然需要训练一个新的SVM,并且会丢失部分旧信息。

为了解决这些方法的固有问题,需要重新训练模型,并且会丢失部分信息,本文的方法就是利用预训练的CNN作为特征提取器,然后使用PQ对特征编码,然后使用 Binary associative memories 进行存储和分类。

整体实现如下图所示:

这里写图片描述

这里比较关键的是第二步,即特征编码,作者使用的是PQ(Product Quantization)[1]方法,实现代码可以参考[2]和[3],这个方法应该是有个比最近邻搜索方法要更加高效的方法。

这个方法的做法是对于第一步提取的特征向量xm,用随机挑选的K个参考点,相互独立的量化成P个大小相等的子矩阵xmp,1pP。这里的参考点Yp=yp1,yp2,......,ypK,且有xmX,xmp=yKp

第二步最终是将特征向量都通过一个字母表(也就是参考点的字母表)转换成一个固定长度的单词qmp,1pP,然后通过一个二进制稀疏的联合内存(binary sparse
associative memory)[4]将这些点一一联系到一个输出的类别,也就是需要将一个对应于qmp的神经元npk关联到对应输出类别cmηc,1cC,C是类别的数量。这里就是对应上图中步骤三的步骤了。

这里第二步的特征编码方法,其实非常类似于Bag of Words,同样也是一种特征编码方法,使用的是kmeans方法,而kmeans需要设置k个中心,这个等同于K个参考点,最终将特征向量变成mk大小的矩阵,m是样本数量,而论文的方法,应该是得到PK,或者应该是P个大小为K的向量,但这只是根据上图和论文的表达猜测得到的。

此外,训练过程不会改变预训练的CNN网络,而联合内存会在得到新的样本或者新类别的样本后进行修改。

论文选择了Cifar10和两个ImageNet的子数据集进行实验,类别分别从0到10增加,然后也对比使用了最近邻搜索的方法,最近邻搜索的方法是比论文使用的PQ的结果要好一些,但是PQ计算更快,内存使用更少,实用性更高。

读后感:
大概了解整个方法的实现流程,但是还是有些疑惑,如何实现这个增量学习的步骤,训练部分肯定是按照上图来一遍的,但是出现新数据后,也是继续用CNN提取特征,然后特征编码,再用这个二进制联合内存来分类,或者是修改这个分类器,如果是这样的话,其实也就是重新训练模型了,还是说,修改的是一种映射关系呢,即npkηc的对应关系。

参考文献:
1. Product Quantization for Nearest Neighbor Search
2. Product Quantization for Nearest Neighbor Search论文实验
3. Github-yahoo/lopq: Training of Locally Optimized Product Quantization (LOPQ) models for approximate nearest neighbor search of high dimensional data in Python and Spark.
4. Sparse Neural Networks With Large Learning Diversity

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

卷积神经网络(CNN)介绍

简单介绍和总结卷积神经网络(Convolutional Neural Networks)的基本组成网络层和常用的网络结构。 参考文章/书籍: An Intuitive Explanation of Convolutional Neural Networks对CNN中pooling的理解《深度学习轻松学:核心算法与…

CC2540低功耗的内幕

一、概述 1、BLE蓝牙协议栈结构 附图6 BLE蓝牙协议栈结构图 分为两部分:控制器和主机。对于4.0以前的蓝牙,这两部分是分开的。所有profile(姑且称为剧本吧,用来定义设备或组件的角色)和应用都建构在GAP或GATT之上。下面…

前端开发怎么用php,做web前端开发怎么样?

前端工程师是互联网时代软件产品研发中不可缺少的一种专业研发角色。从狭义上讲,前端工程师使用 HTML、CSS、JavaScript 等专业技能和工具将产品UI设计稿实现成网站产品,涵盖用户PC端、移动端网页,处理视觉和交互问题。从广义上来讲&#xff…

机器学习入门系列(1)--机器学习概览(上)

最近打算系统学习和整理机器学习方面的知识,会将之前看的 Andrew Ng 在 course 课程笔记以及最近看的书籍《hands-on-ml-with-sklearn-and-tf》结合起来,简单总结下机器学习的常用算法,由于数学功底有限,所以可能不会也暂时不能过…

oracle 安装display,Linux安装Oracle 11时报错DISPLAY解决方案

在Linux上安装Oracle时,经常会报以下错误:无法使用命令 /usr/X11R6/bin/xdpyinfo 自动检查显示器颜色。请检查是否设置了DISPLA在Linux上安装Oracle时,经常会报以下错误:无法使用命令 /usr/X11R6/bin/xdpyinfo 自动检查显示器颜色…

机器学习入门系列(2)--机器学习概览(下)

这是本系列的第二篇,也是机器学习概览的下半部分,主要内容如下所示: 文章目录1. 机器学习的主要挑战1.1 训练数据量不足1.2 没有代表性的训练数据1.3 低质量的数据1.4 不相关的特征1.5 过拟合1.6 欠拟合2. 测试和评估3. 小结1. 机器学习的主要…

[实战] 图片转素描图

本文大约 2000 字,阅读大约需要 6 分钟 我们知道图片除了最普通的彩色图,还有很多类型,比如素描、卡通、黑白等等,今天就介绍如何使用 Python 和 Opencv 来实现图片变素描图。 主要参考这篇文章来实现–How to create a beautifu…

[实战]制作简单的公众号二维码关注图

本文大约 1933 字,阅读大约需要 6 分钟 最近刚刚更换了公众号名字,然后自然就需要更换下文章末尾的二维码关注图,但是之前是通过 windows 自带的画图软件做的,但是之前弄的时候其实还是比较麻烦的,所以我就想作为一名程…

linux初始化进程ppid号,linux基础(十一)--系统初始化的简谈

我们在深入学习linux之前呢首先要了解其的引导加载过程,这样我们就可以在判断一些在系统初始化过程的出现问题的来源,并及时做出处理。这个过程大概分为【开机】——【BIOS】(CMOS)——【grub或者其他引导程序】——【kernel boot】(initrd文件)——【in…

Vim 快速入门

本文大约 5000 字, 阅读大约需要 10 分钟在 Linux 下最常使用的文本编辑器就是 vi 或者 vim 了,如果能很好掌握这个编辑器,非常有利于我们更好的在 Linux 下面进行编程开发。vim 和 viVim是从 vi 发展出来的一个文本编辑器。代码补完、编译及…

(转载)Qt中使用cout输出的方法

&#xff08;转载&#xff09;http://blog.sina.com.cn/s/blog_4f183d960100sdxf.html最近用QT写一个控制台程序&#xff0c;却不能将提示文本输出到屏幕。 cout<<"abcd"正常运行但是屏幕上却没有输出。 解决办法&#xff1a; 在qt的工程文件(.pro文件)中加入以…

Vim快速入门

本文大约 5000 字&#xff0c; 阅读大约需要 10 分钟 在 Linux 下最常使用的文本编辑器就是 vi 或者 vim 了&#xff0c;如果能很好掌握这个编辑器&#xff0c;非常有利于我们更好的在 Linux 下面进行编程开发。 vim 和 vi Vim是从 vi 发展出来的一个文本编辑器。代码补完、编…

linux内核 cpu_die,Linux内核Crash分析

结合上面的知识&#xff0c;看下当内核打印堆栈信息时&#xff0c;都打印了上面信息。下面的打印信息是工作中遇到的一种情况&#xff0c;打印了内核的堆栈信息&#xff0c;PC指针在dev_get_by_flags中&#xff0c;不能访问的内核虚地址为45685516&#xff0c;内核中一般可访问…