下午五点,成功实现了UFLDL中的稀疏自编码器,感觉一个字——爽!哈哈哈。。。看来自己还是有一点coding ability的,而且这次实验,对于自己认识与学习coding和增进信心能起到帮助。
先前代码写完了,但是最后出来的结果很不理想(不是所谓的edge detetor),自己也意识到有一点不对劲,因为gradient check那一部分,解析解和数值解相差的数量级有点大(10^-5,而非提示的10^-9);于是回到sparseAutoencoderCost.m中去看,发现整个的逻辑都没有问题,最后察觉到有一处
图中红线对应的是regularization item的偏导,自己把W2 W1 写成了W2grad和W1grad, 改过来后再运行gradient check,误差数量级减到了10^-11 ,把gradient check注释掉,运行整个程序,学习到的隐层权重用图像表示出来为:
可以看到,稀疏自编码器确实学习到的是一组边缘检测器。
整个的代码(已矢量化编程)在这里,希望对其他初学者有帮助。