自学习 与 无监督特征学习

基本内容

在以前课程的基础上,本章的内容很好理解。
git

好比要对手写数字进行识别,咱们拥有大量未标注的和少许已标注的手写数字图片。图片是灰度图,尺寸是 28×28(=784),能够将 784 维向量直接做为输入,但此时模型复杂度较高,也没有减少噪音和次要特征的影响。因此若是能提取原数据的主要特征做为输入,能够提升预测的准确度。github

稀疏自动编码器就是一个很好的特征选择算法。算法

通过训练,隐藏层的输出(Features)能够替代原数据做为分类算法的输入。网络

基本概念就这么多,本章的难点在于理论与实践的结合。wordpress


课后做业

先吐槽一下 oschina 博客的代码插件,没有 Matlab 选项却有 Google Go,oschina 认为 Go 比 Matlab 应用更普遍吗?函数

这也是我在这个系列文章里不贴代码只给连接的缘由。
测试

主要代码及运算结果

代码地址编码

stlExercise.m - 程序的入口和主线spa

稀疏自编码器可视化:插件

使用提取出的特征训练 Softmax 分类器,测试结果:

使用原数据训练 Softmax 分类器,测试结果:

加入数据白化

若是在交给稀疏自编码器提取特征以前,对原数据作一些预处理结果会怎样?

咱们知道对图像数据作白化处理能够平滑去噪、减少特征之间的相关性。下面就看看加入数据白化后的结果。

图1是原始图像、图2是白化后的图像、图3是稀疏自编码器学到的特征。

预测准确度为:

白化的准确度反而略低,缘由多是:

1. 天然图片场景复杂、噪音多且局部特征高度相关,这些因素对模型训练起到负面影响,干扰了模型对目标物体的识别,因此零均值化和白化等预处理经常使用于天然图片。

2. MNIST 所提供的手写数字图片构图很简单:只有深色背景和浅色数字,且噪音不多。即便背景与数字内部的像素灰度各自高度相关,但这种相关刚好把主要信息与无关信息区分开来,因此不作预处理是可行的。相反,白化使图像更平滑,反而模糊了数字边界。

3. 稀疏自编码器的激活函数使用了 sigmoid 函数,它的值域是(0, 1),即自编码器每一个维度的输出都在这个范围内;当输入不在这个范围内时,要在训练编码器以前对输入作预处理(缩放),把它的值域调整到(0, 1);幸运的是 MNIST 图片自己数据就在(0, 1)内,因此省去了缩放处理;白化会使 MNIST 图片的值域变化,这也是这里不采用白化的重要缘由。

关于天然图像的白化,推荐 一篇文章

稀疏自动编码器与分类器使用同一组数据

以前做业中使用标记为 {5,6,7,8,9} 的数据训练稀疏自编码器,然而模型的目标是对 {0,1,2,3,4} 进行识别。直观上,使用数据集 A 训练的稀疏自编码器所提取的特征与 A 较相关,此时,用它来对数据集 B 作特征提取更可能致使数据失真。

为了验证这个想法,稀疏自编码器和分类器都使用标记为 {0,1,2,3,4} 的数据来训练:

以前的 unlabeled data 有 29404 之多,而如今使用 training data 只有 15298,且 autoencoder 与 softmax 共用,只不过 autoencoder 不使用相应的 training labels。

计算结果:

能够看到在训练数据减半的状况下预测准确度依然小有提高。


总结

对于手写数字识别,白化并没有必要;训练稀疏自编码器的无标记数据对特征自动提取有必定影响,但不大。若是考虑到手写数字的倾斜,也可对图片作纠偏(deskewing),使数字的纵向主轴保持垂直。

下面是将一些不一样的神经网络模型应用在 MNIST 数据上的计算结果:

我所截取的几条都是较接近本文所采用模型的方法,其中表现最好的模型的预测准确度在 98%-99% 之间(表格第2列给出预处理方法;表格第3列给出错误率)。

补充说明:MNIST 包括一个 training set 和 一个 test set,截图中的模型均使用 training set 训练,使用 test set 测试。而本文将 training set 等分红两个子集 S1 和 S2,其中 S1 包含全部 {5,6,7,8,9},用来训练 autoencoder,S2包含全部 {0,1,2,3,4};S2 再作2等分,一个训练分类器,一个作测试,并未用到 MNIST 中的 test set。

相关文章
相关标签/搜索