Matlab — используйте обученную сеть для тестирования

Мой проект заключается в распознавании древних монет. Я использую Матлаб. У меня уже есть файл функций, который содержит как входные данные, так и выходные данные. Я обучил 3 типа монет, используя newff, и сеть была сохранена. Для трех типов монет я использовал 01, 10 и 11 в качестве целей. Теперь я хочу использовать эту обученную сеть для тестирования. У меня тоже есть тестовые изображения. Я закодировал так:

load net.mat;
load features.mat;
testInputs = Features';
out = sim(net,testInputs);
[dummy, I]=max(out);

Значение I используется для проверки типа монеты. Если I равно 1, введите 1, если 2, то введите 2, а если 3, введите 3. Я прав? Я жестко закодировал эти значения 1,2,3, потому что я указал цели как 01, 10 и 11.

if (I == 2)
    fprintf('Type1\n');
elseif (I == 1)
    fprintf('Type2\n');
elseif (I == 3)
    fprintf('Type3\n');
else
    fprintf('undefined\n');
end

Хотя сейчас я ввожу 3 типа тестовых изображений монет, для значения I отображается либо 1, либо 2. Но не 3. Даже когда я использую тот же набор изображений, которые используются для обучения, он также дает либо 1, либо 2 для значения I.

Не могли бы вы мне помочь?


person Nadeeshani Jayathilake    schedule 13.03.2011    source источник
comment
Посмотрите на матрицу весов (я забыл, как получить к ней доступ) и убедитесь, что ваша сеть не остановилась на локальном минимуме с нулем в качестве веса для третьего.   -  person jonsca    schedule 13.03.2011
comment
Я новичок в матлабе. Можете ли вы объяснить мне немного больше? Я не мог понять, что вы сказали выше. Когда я тренирую свой набор данных, для 3 типов монет я указал [0,1], [1,0] и [1,1] в качестве целей. Разве я не могу дать так? После обучения, когда я сравниваю обученные данные с моими тестовыми изображениями, которые я использовал, out = sim(net,testInputs); [пустышка, I]=max(out); а затем если (I == 2) fprintf('Type1\n'); elseif (I == 1) fprintf('Type2\n'); elseif (I == 3) fprintf('Type3\n'); иначе fprintf('не определено\n'); конец. Это неправильно? Я всегда возвращаю либо 1, либо 2.   -  person Nadeeshani Jayathilake    schedule 13.03.2011
comment
Весовая матрица содержит сильные стороны связи между отдельными единицами. Если вы не знакомы с этим, вам следует прочитать документацию Matlab. Затем вы можете увидеть, в какой степени вклад третьего блока влияет на результат.   -  person jonsca    schedule 13.03.2011
comment
См. Matlab thread и документацию. Извините, закончилось время редактирования другого.   -  person jonsca    schedule 13.03.2011
comment
Ничего страшного. И большое спасибо. Я пройду.   -  person Nadeeshani Jayathilake    schedule 13.03.2011


Ответы (1)


Второй аргумент max() даст вам индекс нейрона с более высоким выходом. Если у вас есть только два нейрона, как в случае, если ваши цели [0,1], [1,0] и [1,1] (обратите внимание только на два элемента на каждой цели), не будет никакого способа получить 3 из этого max(). Вы должны попробовать [0,0,1], [0,1,0] и [1,0,0].

Кстати, если вы используете tansig в ​​качестве функции активации нейронов, рассмотрите возможность использования -1 вместо 0 для целей, чтобы вы могли лучше использовать нелинейность. Что-то вроде [-1,-1,1], [-1,1,-1], [1,-1,-1].

person FelipeFG    schedule 18.03.2011