Torch学习——有监督学习

Torch学习——有监督学习


1. 街拍房间号数据集(SVHN)


SVHN是对数据预处理和形式要求最小的现实图像集。和MNIST相似,但插入更多有标签数据并且来自1个更加困难,未解决的现实问题(识别自然场景图像中的数字)。SHVN来自谷歌街景图片[1]。


(1)简介

a. 10类:每类为1个数字,数字1有标签1,数字9有标签9,数字0有标签10。
b. 73257幅图像用于训练,26032幅图像用于测试,531131幅图像是额外的较容易的样本用来额外的训练数据。
c. 来自两种形式:带数字边框的原始图像;大小为32*32的单个字母位于中心的类似于MNIST的图像。


(2)形式2

类似MNIST。所有的数字都固定为大小为32*32的图片。加载.mat文件会创建两个变量:

X——包含图像的4D矩阵;
y——类标签的矢量。

X(:,:,:,i)获取第i张大小为32*32的RGB图像,标签为y(i)。


2. 加载数据集


(1)加载训练和测试图像;
(2)将图像映射到YUV颜色空间,从颜色信息中分离出光照信息;
(3)YUV通道分别归一化:计算训练图像各通道的均值和标准差,减去各通道的均值除以标准差来归一化各通道;
(4)Y通道局部归一化:用SpatialContrastiveNormalization函数加载一维高斯模版对Y通道滤波(P.S.没查到这个函数的搞法~);
(5)验证各通道的均值和方差;
(6)显示前256张训练图像的Y,U,V通道图像,如下图所示。


Torch学习——有监督学习_第1张图片

3. 模型


输入有3个特征图。通常所有nn.Spatial*层都作用在3D数组上,第1维是不同特征(归一化后YUV通道)的索引,并且后面2维是图像/地图的宽度和高度的索引。
第1层应用16个滤波器至输入图(在不同层间随机选择),每个滤波器的大小为5x5。第1层产生的输出图大小为16x28x28。线性变换后紧跟非线性(tanh)和1个L2池化函数,池化区域大小为2x2且池化步长为2x2。操作的结果是产生1个16x14x14的数组,这个数组代表1个16维特征向量的14*14图。每个单元的感受野为7x7。
nfeats为特征的数目,nstates为滤波器的数目,fanin为扇入数目(第1层随机连接表的输入数目为3,输出数目为16,扇入数目为1)。根据随机连接表(Random Connection Table)的函数定义[2]知这里第1层的连接表包含nin(3)个输入图和nout(16)个输出图,每个输出图都有nto(1)个输入图连接。

第2层和第1层非常相似,但现在是16维的特征图映射到256维的特征图,采用全连接(这里原文说的是全连接,但它用的还是随机连接表,输入数目为16,输出数目为256,每个输出会从16个输入中随机选出4个和它连接,想象不出跟全连接有什么关系,不过下一层是全连接层):输出数组的每个单元受前一层的每个4*5*5的特征区域的影响(每个连接表)。该层因此有4*256*5*5个可训练的核权重(外加256个偏置)。第2层输出(卷积+池化)数组的大小为256x5x5。
第2层的5x5大小的256维特征图展平成1个6400维的向量,然后传给后面的两层神经网络。最后预测值(类间的10维分布)受32x32大小的输入变量(YUV像素)影响。

最近的工作(Jarret等)展示了在模型每层都对内部特征局部归一化的优点。对实例用更加平滑的池化函数(L2正则而不是最大池化。注:这个观点和Stanford计算机视觉组对池化效果总结出的观点是不同的。)能够更好地泛化(Sermanet等)。
另外,在内部层用全连接层显然不是好主意。通常,连接密度上倾向用大量特征(过完备)有助于实现更好的结果(Hedsell等)。SpatialConvolutionMap模块可以创建两层间的任意稀疏连接,见nn.tables[2]。



4. 损失函数


最简单的损失函数为整个数据集的预测值和真实值间的均方误差:nn.MSECriterion()。
更加常用的概率目标函数为负log似然。为了最小化负log似然,首先要将模型的预测变成归一化的log概率。对于线性模型,通过把输出单元送进softmax函数实现,从而将线性回归转换成Logistic回归。分类问题最后的预测结果是softmax输出的概率分布的最大值对应的标签。
更通用的是,任何模型的输出通过顶层的softmax函数转成归一化的log概率:model:add(nn.LogSoftMax())。
我们想最大化数据集中每个样本正确类的似然。这等价于最小化负log似然(NLL),或者最小化我们模型的预测分布和目标(训练数据标签)的交叉熵。
nn.ClassNLLCriterion()的输入为softmax函数输出的log概率向量,输出为指向正确类的整数索引。
nn.MultiMarginCriterion()的输入不要求归一化,和SVM损失很接近。如果效果不好,考虑缩放梯度或调整学习率[4]。

5. 卷积网络训练的小贴士


(1)学习率

通过随机梯度下降优化对步长大小或学习率非常敏感。1个很好的启发是学习率为lr_0/(1+t*decay)。衰减值和样本数成反比。

(2)范数正则化

L1/L2正则典型的尝试值为10^-2或10^-3。通常仅在MLP的顶层有用。

(3)滤波器数目

特征图大小随深度增加而衰减,输入层的附近层有更少的滤波器。事实上,为在每层都均衡计算,特征数目和像素位置的乘积在层间大概是常数。为保留输入世界的信息,要求激活函数的总数(特征数目和像素位置的乘积)从当前层到下一层不会减少。特征图数目直接控制网络容量,所以该值的选择取决于可获得样本的数目和任务的复杂性。

(4)滤波器大小

滤波器大小通常取决于数据集。MNIST大小的图像(28x28)通常在第1层的滤波器大小为5x5,而自然图像数据集(每维通常有上百个像素)趋向于第1层使用更大的滤波器(7x7到12x12)。
因此找到“粒度”(滤波器大小)的适当水平从而可以在特定数据集的合适尺度上创建抽象特征。
多尺度感受野也可能用到,这使得卷积网络有更大的感受野,同时保持很低的计算复杂度。这类过程在场景解析(上下文对识别物体很重要)中。

(5)池化大小

池化的典型值为2x2。巨大的输入图像在底层中可能需要4x4池化。然而这将以16的倍数降采样,有可能导致丢失太多有用的信息。通常池化区域和池化步长分开设置。Torch中池化模块(L2,average,max)有独立的参数:pool_x,pool_y,stride_x和stride_y[5]。

6. 代码示例

源代码分成很多模块,也有调用CUDA的命令行选项。进去查看后发现并不是这样,因为torch和nn的CUDA版本为cutorch和cunn,源码并没有调用。CPU下运行ConvNet很慢,而且样本数也不少,所以最后没有运行完成。不过后面有时间会去分析另一位大神在Github上发布的在Cifar数据集上的代码,模型框架为VGGNET。

7. 参考链接


[1] http://ufldl.stanford.edu/housenumbers/
[2] http://nn.readthedocs.org/en/rtd/convolution/#nn.tables.full
[3] http://code.madbits.com/wiki/doku.php?id=tutorial_supervised_2_model
[4] http://code.madbits.com/wiki/doku.php?id=tutorial_supervised_3_loss
[5] http://code.madbits.com/wiki/doku.php?id=tutorial_supervised_a_tips

你可能感兴趣的:(deep,learning,torch,有监督学习)