1

我正在尝试学习如何将稀疏编码算法与 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;
4

1 回答 1

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 项目有自己的邮件列表,顺便说一下,您可能会在其中获得更快或更全面的回复。

于 2014-07-15T17:29:19.803 回答