我正在尝试学习如何在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;
最佳答案
这可能是少数几个问题之一,但是鉴于描述的原因,很难说出是哪个问题(或者是否完全是其他问题)。但是,这三个想法应该提供一个很好的起点:
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项目有其自己的邮件列表,顺便说一句,您可能会在其中得到更快或更全面的答复。