在MATLAB和Scipy.optimize

时间:2018-08-08 14:28:23

标签: python scipy autoencoder

我一直在关注斯坦福UFLDL系列(http://ufldl.stanford.edu/wiki/index.php/Exercise:Sparse_Autoencoder)中的稀疏自动编码器教程。

我完成了MATLAB版本的实现,并且运行得很好,但是当将相同实现移植到Python(带有numpy,scipy和Matplotlib)时,我注意到了一些差异。

我注意到成本函数没有最小化到相同的幅度。我知道,由于theta是随机初始化的,每次运行都会给出不同的最终成本值,但是在将这两种实现重新运行20次以上之后,我总是看到Python实现产生 f_cost = 4.57e-1 ,而MATLAB版本给出了有关 f_cost = 4.46e-1 的答案。换句话说,〜0.01 存在一致的差异。

由于这是两种在理论上相同的实现(相同的成本函数,相同的梯度,相同的minFunc,LBBFS)

由于我怀疑该问题取决于成本函数和梯度计算,因此无法在几行中重现该问题。但是您可以在Github(https://github.com/alanhyue/cs294a_2011-sparseAutoencoders)上找到Python和MATLAB中的完整代码。

其他详细信息

还有更多细节可能有助于澄清问题。

  1. LBFGS和LBFGS-B 本教程提供的入门代码使用LBFGS来最小化theta,而我在Scipy中找不到确切的等效项,而是使用scipy.optimize.fmin_l_bfgs_b。我在Wikipedia上读到LBFGS-B是LBFGS的盒装版本。我想他们应该给出相同的结果?

  2. 两个实现均通过了数值梯度检查 我认为这意味着梯度计算是正确的。

  3. 结果看起来有些正确。 正如讲义中指出的那样,正确的实现应该获得线检测器的集合,这意味着每个面片都看起来像直线的图片。

这是Python的结果(成本为0.457)。 Results of Python implementation

这是MATLAB的结果(成本为0.446)。 enter image description here

0 个答案:

没有答案