http://blog.csdn.net/dinosoft/article/details/50103503
推荐一个deep learning绝佳的入门资料
* UFLDL(Unsupervised Feature Learning and Deep Learning)教程 http://deeplearning.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B
故意把链接地址也写出来,方便看到来源,嘿嘿。
资料写得相当赞,还有中文版。看懂里面的idea是很快,exercise要写的话就得把公式细节搞搞清楚了,一定要做一下,加深理解。代码我是不会贴的,记录一些有的没的吧。特别是用octave遇到的坑,用matlab貌似是没有的,(哭
一开始用octave,因为coursera的那个课程就用octave。后来慢慢发现不对劲,UFLDL这个课程用的是matlab,而且要64bit的,不然可能内存不够。哎,发现免费的东西有时候确实不太行。
一些小技巧
- return 命令中间退出。先调试前几个step的时候有用。
- pause() 中间停住。任意键继续。不想继续就ctrl+c退出。哎,原来matlab有节的概念,就没这个问题,可以按小节运行。
- fflush(stdout) 不要缓冲了,赶紧输出迭代进度。
- close all 弹出好多figure,一个一个点太麻烦了。
Exercise:Sparse Autoencoder
直接跑发现有问题,挺烦的,原本公式就有点乱的,容易写错,还要整一些语言的问题。我的环境是win10 + octave 4.0,调用lbfgsC.c有问题,会出现lbfgsC undefined的问题,只能自己编译一下了。虽然把代码里面的lbfgsC改成lbfgs是能跑,但貌似太慢了。minFunc.m里面可以在fprintf迭代次数Iteration之后加上fflush(stdout);不然输出不及时,等得蛋疼,都不知是挂了还是怎样。
lbfgsC.mex*是供matlab/octave调用的c接口。minFunc的主页。下载下来后改改mexAll.m,然后就可以编译,没啥坑爹的依赖问题。然后把*.mex 文件拷贝到starter/minFunc就行了。
另外display_network 第93行
h=imagesc(array,'EraseMode','none',[-1 1]);
%改成
h=imagesc(array,[-1 1] ,'EraseMode','none');
- 1
- 2
- 3
- 1
- 2
- 3
Exercise:Vectorization
主代码从train.m拷一份,不过注意,把computeNumericalGradient这个过程注释掉,这个太费时了,上个实验已经验证好了。
lbfgsC: failed to allocate xxx bytes of memory
还以为内存不够,换到8G内存的机器还是不行。
看文档的faq。train.m文件要加上options.Corr=9;选项。
error: out of memory or dimension too large for Octave's index type
error: called from
loadMNISTImages at line 17 column 8
- 1
- 2
- 3
- 1
- 2
- 3
貌似有内存泄露什么鬼,执行clear -a 清一下空间就可以了,蛋疼。之前都是直接关掉octave重启。octave的gui后来也不行了,换cli吧。
PCA
像mean(M, 2)这种函数怎么理解? 按第二维进行聚合,就是”干掉”某一维。算平均数是按什么维度来求平均要想好。
- 白化(whitening) pca后的特征方差归一(所以缩放因子是1/sqrt(λ)),直观上数据在一个n维“正方体”。
- ZCA白化 数据坐标旋转到源数据方向一致(PCA后坐标轴变成主特征向量方向)。通常保留全部n维
Exercise:Softmax Regression
有没发现训练完,predict的时候其实没必要算exp(θx),直接θx就可以了,函数单调,而且最后求的是argmax。但训练的时候不能简化。
%提示 help max
[v idx] = max(a, [],1)
- 1
- 2
- 1
- 2
Exercise:Self-Taught Learning
error: out of memory or dimension too large for Octave's index type
- 1
- 1
这回貌似是2G地址不够用了,要64位的才行,总之win上要编译64位的挺麻烦,而且看了资料,即使是64位的内部也不是完全都64位化,蛋疼。matlab好像就没有这个问题,太大不想装。直接数据改小吧。
unlabeledData = unlabeledData(:, 1:5000);
%Test Accuracy: 98.280821%
5000就好了,反正结果也还不差。
%小技巧,训练实在太久,可以把结果保存起来,免得挂了重来
save opttheta
load opttheta
- 1
- 2
- 3
- 1
- 2
- 3
Exercise: Implement deep networks for digit classification
提醒注意两个地方:
1. We have implemented checkStackedAECost.m
to help you check your gradients.
2. When adding the weight decay term to the cost, you should regularize only
the softmax weights (do not regularize the weights that compute the hidden layer activations).
坑爹的,octave跑6w样本实在跑不动,到这里我才发现课程是针对matlab设计的。没注意第二点,隐藏层的weight是不需要正则化,2w样本跑出来准确率只有不到92%,就想验证一下是不是数据量太少的缘故(心里也没谱,因为之前用少量数据准确率没有掉得很厉害),后面实在不行,就装了matlab 64bit,整整7G多。跑了6w数据,准确率还是那么低才死心。仔细查出来忘记看第二点了,果然欲速则不达啊。
Exceeded Maximum Number of Iterations
Before Finetuning Test Accuracy: 87.300%
After Finetuning Test Accuracy: 97.880%
- 1
- 2
- 3
- 1
- 2
- 3
四个过程迭代次数分别是400,400,100,200。看准确率应该对的。先试了一下3000个数据,准确率有92%多。果然数据多才是王道。
2w数据的话(Octave跑得动,看来matlab不是必须的)
Before Finetuning Test Accuracy: 87.880%
After Finetuning Test Accuracy: 96.820%
- 1
- 2
- 1
- 2
所以1-2w数据在95%+是正常的,92%以下就要查查了。
Exercise:Learning color features with Sparse Autoencoders
这个容易,没啥好说的。
Exercise:Convolution and Pooling
以为很简单,可以秒杀,结果坑爹的。。
1. 一个问题是channel。一下子有点懵,明明上一个exercise是3个channel合并到一起的,怎么要拆开了?其实没有大的变动,就是要自己做一些数值计算合并的动作。还以为上一步的东西要改改啥的。
2. conv2函数。没用过,其实就是帮你把恶心的for循环给实现了。我是先构造了简单的矩阵来试试conv2函数。文档已经提示你要用valid参数了,再help conv2一下看看怎么配就可以了。step 3 stepSize=50居然跑不动,改成20了,数字要整除400才行。好慢,跑了近40分钟。
小结
果然动手写写代码能加深印象,调试代码才是最费时间精力的。比如softmax那里多写了一个log,调试得半死,关键是不知道到底那里错了。
另外就是训练跑起来特别费时,用cuda貌似可以加速。后面准备用theano试试看