Я работаю над созданием двухслойной нейронной сети с обратным распространением. Предполагается, что NN получит свои данные из вектора 20001x17, который содержит следующую информацию в каждой строке:Matlab - Обучение нейронной сети
- Первые 16 ячеек содержат целые числа от 0 до 15, которые действуют как переменные, которые помогают нам определить, какая из 26 букв алфавита, который мы хотим выразить при просмотре этих переменных. Например, последовательность из 16 значений, как указано ниже, предназначена для обозначения буквы A: [2 8 4 5 2 7 5 3 1 6 0 8 2 7 2 7].
-17-я ячейка содержит число от 1 до 26, представляющее букву нужного нам алфавита. 1 обозначает A, 2 обозначает B и т. Д.
Выходной уровень NN состоит из 26 выходов. Каждый раз, когда NN подает вход, подобный описанному выше, он должен выводить вектор 1x26, содержащий нули во всех, кроме одной ячейки, которая соответствует букве, которую должны были представлять входные значения. например, выход [1 0 0 ... 0] будет буквой A, тогда как [0 0 0 ... 1] будет буквой Z.
Некоторые вещи, которые важны, прежде чем я представляю код: I необходимо использовать функцию traingdm и номер скрытого слоя фиксируется (на данный момент) на 21.
Попытки создать вышеуказанную концепцию я написал следующий код MatLab:
%%%%%%%%
%Start of code%
%%%%%%%%
%
%Initialize the input and target vectors
%
p = zeros(16,20001);
t = zeros(26,20001);
%
%Fill the input and training vectors from the dataset provided
%
for i=2:20001
for k=1:16
p(k,i-1) = data(i,k);
end
t(data(i,17),i-1) = 1;
end
net = newff(minmax(p),[21 26],{'logsig' 'logsig'},'traingdm');
y1 = sim(net,p);
net.trainParam.epochs = 200;
net.trainParam.show = 1;
net.trainParam.goal = 0.1;
net.trainParam.lr = 0.8;
net.trainParam.mc = 0.2;
net.divideFcn = 'dividerand';
net.divideParam.trainRatio = 0.7;
net.divideParam.testRatio = 0.2;
net.divideParam.valRatio = 0.1;
%[pn,ps] = mapminmax(p);
%[tn,ts] = mapminmax(t);
net = init(net);
[net,tr] = train(net,p,t);
y2 = sim(net,pn);
%%%%%%%%
%End of code%
%%%%%%%%
Теперь к моей проблеме: я хочу, чтобы мои выходы были такими, как описано, а именно каждый столбец вектора y2, например, должен представлять собой букву. Мой код этого не делает. Вместо этого он дал результаты, которые сильно варьируются от 0 до 1, значения от 0,1 до 0,9.
Мой вопрос: есть ли какие-то преобразования, которые мне нужно делать, чтобы я не был? Смысл, мне нужно преобразовать данные ввода и/или вывода в форму, с помощью которой я действительно могу увидеть, правильно ли учится NN?
Любой вход будет оценен.
Мартин, спасибо за ответ. Используя max (y2), я теперь могу получить некоторую информацию о том, сколько раз сеть была права на идентификацию букв. Тем не менее, что я сделал, прежде чем подавать сеть, данные, которые у меня были, уменьшили ее, так что 0 <= p (x) <= 1. Увидев, что минимальное значение p равно 0, а максимум равен 15, я сделал новый вектор ввода scaledp = p/15. –
Вы не должны использовать max в качестве функции активности, потому что ваша функция ошибки должна быть определена над активностью, а не активацией, а max недифференцируема, что означает, что вы не можете использовать back-prop. Вам нужно softmax, см. Мой ответ ниже. –