我正在尝试学习如何在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项目有其自己的邮件列表,顺便说一句,您可能会在其中得到更快或更全面的答复。

08-24 14:29