У меня есть нейронная сеть Кохонена, состоящая из десяти нейронов и кучи входов. На вход ей подается спектральные портреты слов (были записаны на диктофон слова от нуля до десяти, а потом преобразованы в спектральные портреты). Перед подачей портреты нормализуются в пределах [-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;
Пойду тогда колдовать с начальной инициализацией весов
Ответ
Такое может быть, если начальные вектора весов лежат в стороне от тренировочных векторов, как на картинке:
Тогда ближайший вектор весов притянется к тренировочным точкам, и дальше все операции будут происходить только с ним.
действительно, если матрицу весов проинициализировать не случайно, а векторами спектральных портретов, то все работает так, как и должно. Но тогда возникает вопрос где же тут самообучение сети, если мы в начале задаем так сказать эталоны.
Предполагается, что у вас есть множество спектральных портретов каждого типа. В ходе самообучения веса перейдут в центр кластера соответствующего одному из типов.
Еще вариант, как избежать ситуации, показанной на картинке: для инициализации считайте среднее всех спектральных портретов, потом к этой точке прибавляйте случайные добавки.
Комментариев нет:
Отправить комментарий