我正在尝试学习如何将稀疏编码算法与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;
答案 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项目有自己的邮件列表,顺便说一句,你可能会得到更快或更全面的回复。