Решение для разреженного кодирования mlpack не найдено

Я пытаюсь научиться использовать алгоритм разреженного кодирования с библиотекой mlpack. Когда я вызываю Encode() для своего экземпляра mlpack::sparse_coding:SparseCoding, я получаю сообщение об ошибке

[WARN] There are 63 inactive atoms. They will be reinitialized randomly. 
error: solve(): solution not found

Просто алгоритм не может изучить скрытое представление данных. Или, может быть, это мое использование? Соответствующий раздел следует за EDIT: одна строка была изменена, чтобы исправить несвязанную ошибку, но исходная ошибка остается.

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;

person Josh    schedule 03.07.2014    source источник


Ответы (1)


Это может быть одна из нескольких проблем, но, учитывая описание, немного сложно сказать, какая из них (или это что-то совершенно другое). Тем не менее, эти три идеи должны стать хорошей отправной точкой:

  • Матрицы в mlpack являются основными по столбцам. Это означает, что каждое наблюдение должно представлять столбец. Если вы используете mlpack::data::Load() для загрузки, например, файла CSV (который обычно представляет собой одну строку для каждого наблюдения), он автоматически перенесет набор данных. SparseCoding будет вести себя странно, если вы передадите ему транспонированные данные. См. также http://www.mlpack.org/doxygen.php?doc=matrices.html.

  • Если есть 63 неактивных атома, то фактически активен только один атом (учитывая, что ATOM_COUNT равно 64). Это означает, что алгоритм обнаружил, что лучший способ представления словаря (на данном шаге) использует только один атом. Это может произойти, если матрица, которую вы передаете, состоит из всех нулей.

  • mlpack предоставит подробный вывод, который также может быть полезен для отладки. Обычно это используется при использовании класса CLI mlpack для анализа ввода командной строки, но вы можете включить подробный вывод с помощью mlpack::Log::Info.ignoreInput = false. Таким образом вы можете получить много результатов, но это даст лучшее представление о том, что происходит...

Между прочим, у проекта mlpack есть собственный список рассылки, где вы, скорее всего, получите более быстрый и исчерпывающий ответ.

person ryan    schedule 15.07.2014
comment
Я обнаружил, что неправильно обращался к матрице броненосца, но я все еще пытаюсь понять, как это работает. Я случайно проиндексировал адрес коврика, что заставило меня думать, что я могу получить к нему доступ с помощью оператора [], но я не могу. Вы знаете, как получить доступ к элементам мата броненосца? Документы, кажется, не упоминают об этом. - person Josh; 16.07.2014
comment
Да; документация может объяснить это лучше, чем я: arma.sourceforge.net/docs.html# element_access Надеюсь, это будет полезно. - person ryan; 17.07.2014
comment
Использование столбцов остановило ошибку «решение не найдено», но теперь кажется, что разреженное кодирование занимает вечность, чтобы найти скрытое представление. Однако это должно быть темой другого вопроса. - person Josh; 18.07.2014