我正在努力学习如何在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;发布于 2014-07-15 17:29:19
这可能是少数几个问题之一,但考虑到这些问题的描述,很难判断是哪一个(或者如果它完全是其他的东西)。然而,这三种想法应该是一个很好的起点:
mlpack::data::Load()来加载,例如一个CSV文件(通常每观察一行),它将自动转换数据集。如果您将转换后的数据传递给SparseCoding,那么它的行为会很奇怪。另见http://www.mlpack.org/doxygen.php?doc=matrices.html。ATOM_COUNT是64)。这意味着算法已经发现表示字典的最佳方法(在给定的步骤)只使用一个原子。如果要传递的矩阵由所有零组成,则可能发生这种情况。CLI类来解析命令行输入,但是可以使用mlpack::Log::Info.ignoreInput = false启用详细的输出。你可以通过这种方式获得大量的输出,但是它会让你更好地了解正在发生的事情。顺便说一句,mlpack项目有自己的邮件列表,您可能会得到更快或更全面的响应。
https://stackoverflow.com/questions/24543984
复制相似问题