在这个问题集,您将实现稀疏自编码算法,并展示它是如何发现的边缘是自然的图像很好的代表性。(由布鲁诺Olshausen提供的图像)稀疏自编码算法的课程网站上找到的讲义描述。
在该文件sparseae_exercise.zip,我们提供了在Matlab一些起始代码。你应该写在文件所指处代码(“ 你的代码HERE ”)。你必须完成以下文件: sampleIMAGES.m,sparseAutoencoderCost.m,computeNumericalGradient.m。在起动代码train.m显示了这些功能的使用。
具体来说,在这个练习中,您将实现一个稀疏的自编码,与使用L-BFGS优化算法8×8的图像块训练。
在软件的说明:提供的.zip文件包含子目录 minFunc与第三方软件实现L-BFGS,即经Creative Commons,属性,非商业许可证授权。如果你需要使用这个软件用于商业用途,你可以下载和使用不同的功能(fminlbfgs),可以达到同样的目的,但运行3倍〜这个练习慢(因此不太推荐)。你可以在阅读更多关于这个Fminlbfgs_Details页面。
第1步:生成训练集
第一步骤是生成训练集。为了得到一个训练样例点¯x,随机选取的10个图像中的一个,然后随机抽样从选定的图像的8×8的图像块,并转换图像修补程序(无论是行优先顺序或列主顺序;它doesn '吨物质)转换成一个64维向量来获得一个训练示例
完成代码sampleIMAGES.m。您的代码应该品尝10000图像块,并将它们连接成一个64×10000矩阵。
为了确保您的实现工作,在“第1步”运行代码train.m。这将导致从数据集200补丁进行随机抽样的情节。
实施过程中的技巧:当我们运行实施 sampleImages() ,它需要在5秒。如果您的实现需要30秒以上,这可能是因为你不小心让每一次你挑选一个随机图像的整个512×512像素的图像的副本。通过复制一个512×512像素的图像10000次,这可以让你实现更高效。虽然这并不代码显著为这项工作慢下来(因为我们只有10000的例子),当我们扩展到更大的问题在本季度晚些时候有10 6或更多的例子,这会显著减慢你的代码。请执行sampleIMAGES这样,你是不是使每个需要切出一个8x8的图像块时整个512×512像素的图像的副本。
第2步:稀疏自编码目标
实施代码以计算稀疏自编码成本函数Ĵ 稀疏(W¯¯,b) (节讲义的3)和相应的衍生物Ĵ 稀疏相对于不同的参数。使用S形函数用于激活函数,。特别是,完成代码sparseAutoencoderCost.m。
稀疏自编码由矩阵参数 , 向量 , 。然而,随后的标记方便,我们将“展开”所有这些参数成为一个非常长的参数向量θ与小号1 小号2 + 小号2 小号3 + 小号2 + 小号3元。对之间的转换的代码(W¯¯ (1) ,W¯¯ (2) ,b (1) ,b (2) )和θ参数在起动代码已经提供。
实施过程中的提示:我们的目标Ĵ 稀疏(W¯¯,b)包含3个方面,相应的平方误差项,权重衰减项,稀疏的处罚。不客气但是要实现这一点,但为了方便调试,可以实现成本函数和微分运算(反向传播)仅适用于平方误差项第一(这相当于设置λ=β= 0),并实施在下一节梯度检验方法首先验证此代码是正确的。然后在验证对应于平方误差项的目标和衍生物计算工作后才,添加在代码来计算重量衰变和稀疏惩罚项和它们的相应的衍生物。
步骤3:渐变检查
继讲义的第2.3节,实施梯度检查的代码。具体来说,完成代码computeNumericalGradient.m。请使用EPSILON = 10 -4作为讲义描述。
我们还提供了在代码checkNumericalGradient.m为您测试您的代码。此代码定义一个简单的二次函数由下式给出 ,并在该点计算它点¯x =(4,10)牛逼。它允许您验证您的数值计算梯度非常接近真(计算分析)梯度。
使用后checkNumericalGradient.m,以确保您的实现是正确的,下次使用computeNumericalGradient.m以确保您的sparseAutoencoderCost.m 正确计算衍生物。有关详细信息,请参阅步骤3 train.m。我们强烈建议你不要进入下一个步骤,直到您确认您的派生的计算是正确的。
实施过程中的提示:如果您在调试代码,执行梯度检查对小排量车型和更小的训练集(例如,使用只有10个训练样本和1-2隐患单位)可以加快速度。
第4步:火车稀疏自编码
现在,你有一个计算代码 Ĵ 稀疏及其衍生物,我们已经准备好,以尽量减少 Ĵ 疏相对于它的参数,从而培养我们的稀疏的自编码。
我们将使用L-BFGS算法。这是提供给您一个调用的函数 minFunc(马克·施密特提供的代码)包含在启动代码。(在这个作业的目的,你只需要调用minFunc使用默认参数。你不需要知道L-BFGS如何工作的。)我们已经在提供的代码train.m (第四步)来调用minFunc。的minFunc代码假定要优化的参数是一个长参数矢量; 所以我们将用“ θ ”参数而不是“ (W¯¯ (1) ,W¯¯ (2) ,b (1) ,b (2) ) ”参数传递我们的参数,它的时候。
火车一疏自编码与64输入单元,25隐藏单元和64个输出单元。在我们的起动码,我们提供了一个功能,用于初始化的参数。我们初始化偏置到零,和权重 ,以随机数从间隔均匀地拉伸 ,其中Ñ 中是扇入(的输入送入一个节点号)和Ñ 出是扇入(的单位数一个节点送入)。
我们对各种参数提供的值(λ,β,ρ等)应该工作,但随时与参数的不同设置,以及发挥。
实施过程中的提示:一旦你有你的BP执行正确计算衍生物(如使用梯度步骤3中检查验证),当你正在使用它与L-BFGS优化Ĵ 稀疏(W¯¯,b),确保你不会每一步做梯度检查。BP算法可以用来计算的衍生物Ĵ 稀疏(W¯¯,b)相当有效,如果你被加计算梯度数值上的每一步,这将你的程序显著放缓。
第5步:可视化
培训自编码后,使用display_network.m可视化的教训权重。(见train.m,步骤5)运行“ 打印-djpeg weights.jpg ”到可视化保存到文件“ weights.jpg”(你将与你的代码一并提交)。
结果
要成功完成这个任务,你应该表现出你的疏自编码算法的一种集学习边缘检测的。例如,这是我们所获得的可视化:
我们实现了约5分钟,以快速的计算机上运行。在你最终需要尝试多个实现或不同的参数值的情况下,一定要预算足够的时间进行调试和运行,你需要的实验。
此外,通过对比的方式,这里有来自我们并不认为成功(无论是越野车的实现,或在参数调优的)实现可视化的东西:
详细步骤在:
http://www.cnblogs.com/tornadomeet/archive/2013/03/20/2970724.html