找不到mlpack稀疏编码解决方案

时间:2014-07-03 02:23:55

标签: machine-learning neural-network autoencoder mlpack

我正在尝试学习如何将稀疏编码算法与mlpack库一起使用。当我在我的mlpack :: sparse_coding:SparseCoding实例上调用Encode()时,我收到错误

[WARN] There are 63 inactive atoms. They will be reinitialized randomly. 
error: solve(): solution not found

简单地说算法无法学习数据的潜在表示。或许这是我的用法?相关部分如下 编辑:修改了一行以修复无关的错误,但原始错误仍然存​​在。

double* Application::GetSparseCodes(arma::mat* trainingExample, int atomCount)
{
    double* latentRep = new double[atomCount];
    mlpack::sparse_coding::SparseCoding<mlpack::sparse_coding::DataDependentRandomInitializer> sc(*trainingExample, Utils::ATOM_COUNT, 1.0);
    sc.Encode(Utils::MAX_ITERATIONS);
    arma::mat& latentRepMat = sc.Codes();
    for (int i = 0; i < atomCount; i++)
        latentRep[i] = latentRepMat.at(i, 0);
    return latentRep;
}

一些相关参数

const static int IMAGE_WIDTH = 20;
const static int IMAGE_HEIGHT = 20;
const static int PIXEL_COUNT = IMAGE_WIDTH * IMAGE_HEIGHT;
const static int ATOM_COUNT = 64;
const static int MAX_ITERATIONS = 100000;

1 个答案:

答案 0 :(得分:1)

这可能是少数几个问题之一,但考虑到描述它有点难以分辨出它是哪一个(或者它是否完全不同)。但是,这三个想法应该提供一个好的起点:

  • mlpack中的矩阵是列专业。这意味着每个观察应该代表一个列。如果您使用mlpack::data::Load()加载,例如CSV文件(每次观察通常为一行),它将自动转置数据集。如果您传递转置数据,SparseCoding会很奇怪。另请参阅http://www.mlpack.org/doxygen.php?doc=matrices.html

  • 如果有63个非活动原子,那么只有一个原子实际上是活跃的(假设ATOM_COUNT是64)。这意味着该算法已经发现表示字典的最佳方式(在给定步骤)仅使用一个原子。如果您传递的矩阵包含全零,则可能发生这种情况。

  • mlpack将提供详细输出,这也可能有助于调试。通常使用mlpack的CLI类来解析命令行输入,但您可以使用mlpack::Log::Info.ignoreInput = false启用详细输出。您可以通过这种方式获得大量输出,但它可以更好地了解正在发生的事情......

mlpack项目有自己的邮件列表,顺便说一句,你可能会得到更快或更全面的回复。