Почему моя функция передачи продолжает возвращаться в «logsig»? - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь создать базовую систему прямой связи с помощью команды patternnet, которая может распознавать данные из набора данных MNIST.Вот мой код

one = [1];
one = repelem(one,100);
%%%%%%%%%%%%%%%Create Neural network%%%%%%%%%%%%%%%%%%%%%
nn = patternnet([100 100]);
nn.numInputs = 1;
nn.inputs{1}.size = 784;
nn.layers{1}.transferFcn = 'logsig';
nn.layers{2}.transferFcn = 'logsig';
nn.layers{3}.transferFcn = 'softmax';
nn.trainFcn = 'trainscg';
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
%%%%%%%%%%%%%%%%Dealing with data%%%%%%%%%%%%%%%%%%%%%%%%%%

mnist_in = csvread('mnist_train_100.csv');
mnist_test_in = csvread('mnist_test_10.csv');
[i,j] = size(mnist_in);
data_in = mnist_in(:,2:785);
data_in = data_in';
target_in = mnist_in(:,1);
target_in = target_in';
nn = train(nn,data_in,target_in);

Проблема в том, что когда я собираю эту систему, передаточная функция в выходном слое устанавливается на функцию softmax.Каким-то образом, когда я тренирую свою систему, передаточная функция превращается в функцию «logsig», и она остается такой, пока я не очищу свое рабочее пространство.Я даже пытаюсь установить передаточную функцию выходного слоя в коде, и программа все еще находит способ изменить его на logsig.Так что я могу сделать что-нибудь.

PS.Я даже пытаюсь собрать эту систему с помощью network (), чтобы все, начиная с scrath, все равно меняло мою функцию переноса с softmax на logsig.

1 Ответ

0 голосов
/ 18 мая 2018

Как я вижу, в параметре divideParam есть ошибка. Вы создали нейронную сеть как nn, но измененные вами параметры принадлежат переменной с именем net. Помимо этого, создание части нейронной сети является нормальным.

Я думаю, что проблема заключается в части подготовки данных. Ваша цель тренировки, target_in, имеет размерность 1 x <Номер образца> . По этой причине функция train заменяет «softmax» на «logsig», чтобы соответствовать выводу.

Выходные данные для softmax должны быть в форме <Номер результата> x <Номер образца>

Например, выходное значение равно 1,2 или 3. Тогда выходной массив не должен быть

[1 2 1 3 3 1 ...]

но это должно быть

[1 0 1 0 0 1 ...;
 0 1 0 0 0 0 ...;
 0 0 0 1 1 0 ...]

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ: Чтобы превратить один массив ( 1 x <Номер выборки> ) в множественный массив ( <Номер результата> x <Номер выборки> ), Данные в одном массиве будут отображаться с индексом. Например, 11 выборок в одном массиве:

[-1    -5.5   4     0     3.3   4    -1     0     0     0    -1]

Проверка всех уникальных номеров и сортировка. Теперь у каждого номера есть свой индекс.

[-5.5  -1  0  3.3  4]   #index table

Проходя по одному массиву, для каждого числа поместите его в правильный индекс. В основном, -1 будет иметь индекс 2, поэтому я буду отмечать 1 во втором ряду в любом столбце, где появляется -1. Наконец,

[ 0     1     0     0     0     0     0     0     0     0     0;
  1     0     0     0     0     0     1     0     0     0     1; #there are three -1 in the single array
  0     0     0     1     0     0     0     1     1     1     0;
  0     0     0     0     1     0     0     0     0     0     0;
  0     0     1     0     0     1     0     0     0     0     0]

Вот код для этого:

idx = sort(unique(target_in));   
number_of_result = size(idx,2);
number_of_sample = size(target_in,2);
target_softmax = zeros(number_of_result,number_of_sample);
for i = 1:number_of_sample
  place = find(idx == target_in(i));  % find the index of the value
  target_softmax(place,i) = 1;        % tick 1 at the row
end
...