Страницы

Поиск по вопросам

понедельник, 29 октября 2018 г.

Проблемы при обучении нейронной сети

У меня есть нейронная сеть Кохонена, состоящая из десяти нейронов и кучи входов. На вход ей подается спектральные портреты слов (были записаны на диктофон слова от нуля до десяти, а потом преобразованы в спектральные портреты). Перед подачей портреты нормализуются в пределах [-1; 1]
Матрица весов заполняется случайным образом при условии:
(1)
где M - длина входного вектора
Подаю я какой-то вектор, считаю для него R и выбираю нейрон с наименьшим R (x - входные параметры):
(2)
Дальше необходимо скорректировать весовые коэффициенты:
(3)
Информацию брал отсюда

Я по очереди подаю на вход спектральные портреты слов "ноль", "один", "два" и т.д. (представляют собой вектор с элементами [-1; 1]). Все слова почему-то попадают на один нейрон. При этом входные вектора довольно разные.
В чем может крыться проблема? Нет ли ошибок в алгоритме сети?

UPD: У меня значения в векторе R (вектор расстояний) получаются практически одинаковые для всех нейронов: 237.3019 237.0699 237.0621 237.4326 237.0400 237.3023 237.3323 237.5506 237.1476 237.3318
О чем это может говорить? Что плохие входные данные?

UPD 2: Код реализации
function [index, W] = recognize(W, X, SPEED) % % W - матрица весовых коэффициентов % X - вектор входных параметров % SPEED - коэффициент скорости обучения % % index - номер нейрона-победителя %
AMOUNT_NEURON = size(W, 1);
% Вычисление R R = zeros(AMOUNT_NEURON, 1); for i = 1:1:AMOUNT_NEURON for j = 1:1:size(W, 2) R(i) = R(i) + (X(j) - W(i, j))^2; end %R(i) = sqrt(R(i)); end
% Определение нейрона-победителя [val, i] = min(R);
% Коррекция коэффициентов for j = 1:1:size(W, 2) W(i, j) = W(i, j) + SPEED*(X(j) - W(i, j)); end
index = i;
Пойду тогда колдовать с начальной инициализацией весов


Ответ

Такое может быть, если начальные вектора весов лежат в стороне от тренировочных векторов, как на картинке:

Тогда ближайший вектор весов притянется к тренировочным точкам, и дальше все операции будут происходить только с ним.
действительно, если матрицу весов проинициализировать не случайно, а векторами спектральных портретов, то все работает так, как и должно. Но тогда возникает вопрос где же тут самообучение сети, если мы в начале задаем так сказать эталоны.
Предполагается, что у вас есть множество спектральных портретов каждого типа. В ходе самообучения веса перейдут в центр кластера соответствующего одному из типов.
Еще вариант, как избежать ситуации, показанной на картинке: для инициализации считайте среднее всех спектральных портретов, потом к этой точке прибавляйте случайные добавки.

Комментариев нет:

Отправить комментарий