An Analysis of Single-Layer Networks in Unsupervised Feature Learning--阅读笔记

一、前言

      目前许多研究都在专注于从无标签的数据中来学习特征的算法,并且在一些基准数据集上取得了很大进展。在这篇论文中,我们主要讨论一些简单的因素对最终结果呈现的影响,它们和算法的选择以及模型的深度一样重要。这些因素是:(1)特征数目;(2)白化;(3)步长;(4)感受野的大小。不同于之前在很多网络层上进行的研究,这篇论文只研究单层网络下的情况。

二、 无监督特征学习框架

特征学习的过程:

                         1. 从无标签的训练图像中随机提取图像块;

                         2. 对图像块进行预处理;

                         3. 利用无监督学习算法来学习特征映射。

特征提取与分类过程:

                        1. 对输入图像的图像块进行特征提取;

                        2. 池化特征以减少特征数目;

                        3. 用给定的特征向量训练线性分类器,来预测标签。

3.1 特征学习

从无标签的输入图片中随机提取图像块,每个图像块都大小为w*w(w指的是感受野的大小),具有d个通道。将每个图像块的像素点拉伸,表示为一个向量,这些向量共同组成R^{N}(N=w*w*d)集合。然后,构建具有m个随机采样图像块的数据集,$X\ =\{​{x^{(1)},...,x^{(m)}} \}$,并且$ x^{(i)} \in\ R^{N}$。根据这个数据集,继续余下的步骤。 

3.1.1 预处理

 归一化处理,每个图像块xi减去平均值,并除以其元素的标准差。归一化处理之后,再对整个数据集进行白化(whitening)处理。

# normalization 
patches = (patches - patches.mean(1)[:, None]) / np.sqrt(patches.var(1) + 10)[:, None]
# whitening
[D, V] = np.linalg.eig(np.cov(patches, rowvar=0))
P = V.dot(np.diag(np.sqrt(1 / (D + 0.1)))).dot(V.T)
patches = patches.dot(P)

3.1.2 无监督学习算法

预处理之后,利用无监督学习算法从无标签数据中学习特征,此处只考虑K-Means聚类算法。应用该算法从输入数据中得到K个中心点,利用这些中心点来得到特征映射f,可两种方法来实现,

一种是硬分类:$f_{k}(x)=\begin{cases} 1\ if\ k=arg\ min_{j}\ \left \| c^{j}-x \right \| _{2}^{2} \\ 0\ otherwise \end{cases}$,一种是非线性的软分类:$ f_{_k}(x)=max\left \{ 0,\mu (z)-z_{k} \right \} $,它会产生稀疏的输出。

其中$ z_{k}=\|x-c^{(k)}\|_{2} and\ \mu (z)$都是元素z的平均值。

centroids = np.random.randn(numCentroids, patches.shape[1]) * .1#产生中心点
num_iters = 50
batch_size = 1000  # CSIL do not have enough memory, dam
for ite in range(num_iters):
    print("kmeans iters", ite + 1, "/", num_iters)
    hf_c2_sum = .5 * np.power(centroids, 2).sum(1)
    counts = np.zeros(numCentroids)
    summation = np.zeros_like(centroids)
    for i in range(0, len(patches), batch_size):
        last_i = min(i + batch_size, len(patches))
        idx = np.argmax(patches[i:last_i].dot(centroids.T) - hf_c2_sum.T, axis=1)
        S = np.zeros([last_i - i, numCentroids])
        S[range(last_i - i),
          np.argmax(patches[i:last_i].dot(centroids.T) - hf_c2_sum.T, axis=1)] = 1
        summation += S.T.dot(patches[i:last_i])
        counts += S.sum(0)
    centroids = summation / counts[:, None]
    centroids[counts == 0] = 0 

3.2 特征提取和分类

无监督学习算法产生了一个函数f,它能把输入的图像块$ x\in R^{N} $转变为一个新的图像表示$ y=f(x)\in R^{K} $,我们称之为特征提取器,我们可以把它用在有标签的训练集中来对图片分类。

3.2.1 卷积特征提取

给定一个n*n像素值,d通道的图像,我们将图像分割成w*w(感受野的大小)的小块,步长(即每隔多远切割一次)为s,利用一个已经学习好的特征提取器$ f\ :\ R^{N} \to R^{K} $,通过计算得到图像块的图像表示$ y=f(x) \in R^{K}。所有图像处理完毕之后,我们得到一个(n-w+1)*(n-w+1)的图像表示(K通道),$ y^{(ij)}$作为从输入图像i,j位置提取的K维特征表示。考虑到计算效率,我们让步长大于1。

def extract_features(X_train):
    trainXC=[]
    idx=0
    for img in X_train:
        idx+=1
        if not np.mod(idx,1000):
            print "extract features",idx,'/',len(X_train)
            print "time",(time.time()-start_time)/60.0 
        patches=sliding(img,[rfSize,rfSize]).T

 

图3-1

3.2.2  分类

分类之前,一般先通过池化对特征表示进行降维。在步长为1的情况下,我们的特征映射产生一个K维的(n-w+1)*(n-w+1)的图像表示。我们可以将所有的$ y^{(ij)}$分为4部分,计算每一部分的和,然后将这些和映射成含4K个数据的向量(如图3-1所示),以此达到降维的目的。之后使用支持向量机进行分类,正则化的参数由交叉验证决定。

三、 实验与分析

3.1 可视化

在展示最终分类结果之前,先来看一下基于聚类算法得到的可视化的结果。我们看到聚类白化数据产生了明显的局部滤波器,这些特征很容易通过聚类方法(没有任何参数调整)来学习。

图3-2

 

3.2 各个因素改变的影响

图3-3

 

图3-4

观察图3-2、3-3可知,加入白化、增加特征数量、合适但大于1的步长以及合适的感受野的大

小,都会导致更好的结果。不同的数据集步长和感受野的大小选择不一样,比如对CIFAR-10数据集,步长为1像素,感受野大小为6像素最为合适。

代码源自:https://github.com/yihui-he/An-Analysis-of-Single-Layer-Networks-in-Unsupervised-Feature-Learning

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值