2016-12-23 11 views
1

Я пытаюсь собрать набор данных MNIST с одним выходом. Это означает, что когда я даю 28 * 28 вход (изображение), модель дает нам простое число. Например, я даю «5», модель дает мне результат 4.9,5, 5.002 или близко к 5. Поэтому у меня есть красные некоторые документы. Люди говорят, что softmaxlayer необходимо изменить с помощью слоя регрессии. Для этого. Я использую библиотеку matconvnet и ее пример mnist. Я изменил свою сеть и написал функцию потери регрессионного слоя. это мои коды:Как изменить softmaxlayer с регрессией в matconvnet

net.layers = {} ; 
net.layers{end+1} = struct('type', 'conv', ... 
          'weights', {{f*randn(5,5,1,20, 'single'), zeros(1, 20, 'single')}}, ... 
          'stride', 1, ... 
          'pad', 0) ; 
net.layers{end+1} = struct('type', 'pool', ... 
          'method', 'max', ... 
          'pool', [2 2], ... 
          'stride', 2, ... 
          'pad', 0) ; 
net.layers{end+1} = struct('type', 'conv', ... 
          'weights', {{f*randn(5,5,20,50, 'single'),zeros(1,50,'single')}}, ... 
          'stride', 1, ... 
          'pad', 0) ; 
net.layers{end+1} = struct('type', 'pool', ... 
          'method', 'max', ... 
          'pool', [2 2], ... 
          'stride', 2, ... 
          'pad', 0) ; 
net.layers{end+1} = struct('type', 'conv', ... 
          'weights', {{f*randn(4,4,50,500, 'single'), zeros(1,500,'single')}}, ... 
          'stride', 1, ... 
          'pad', 0) ; 
net.layers{end+1} = struct('type', 'relu') ; 
net.layers{end+1} = struct('type', 'conv', ... 
          'weights', {{f*randn(1,1,500,1, 'single'), zeros(1,1,'single')}}, ... 
          'stride', 1, ... 
          'pad', 0) ;       
net.layers{end+1} = struct('type', 'normloss'); 

это функция потерь регрессии:

function Y = vl_normloss(X,c,dzdy) 
size(X)%1 1 1 100 
size(c)%1 100 

if nargin <= 2 

Y = 0.5*sum((squeeze(X)'-c).^2); 
size(Y)%1 1 
Y  % 1.7361e+03 
else 
size(Y) 
Y = +((squeeze(X)'-c))*dzdy; 
Y = reshape(Y,size(X)); 
end 

Я изменил opts.errorFunction = 'multiclass' ; к 'none' Также я добавить

case 'normloss' 
     res(i+1).x = vl_normloss(res(i).x,l.class) ; 

в vl_simplenn сценарий

Но когда я запускаю поезд, эта ошибка возникает

Ошибка использования vl_nnconv Размеры DEROUTPUT несовместимы с X и ФИЛЬТРАМИ.

Ошибка в vl_simplenn (строка 415) [Рез (я) .dzdx, dzdw {1}, {2 dzdw}] = ...

, что я должен сделать для решения этой проблемы? спасибо

+0

> Я пытаюсь подготовить набор данных MNIST с одним выходом Не делайте этого. Использование регрессии для задач классификации - плохая идея. –

+0

Я знаю, что это плохая идея, но я должен это делать –

+0

Я сделал то, что вы сказали, я имею в виду, что я изменил vl_simplenn и использовал потерю нормы как последний слой, но все же, когда я тренирую сеть, на выходе она говорит, что это softmaxloss и он не использует normloss. вы не знаете, почему это происходит? –

ответ

0

Я нашел решение. Я сделал ошибку. В скрипте vl_simplenn необходимо изменить две строки, но я изменил только одну строку. Этот код работает.

0

У меня вопрос.

net.layers{end+1} = struct('type', 'conv', ... 
          'weights', {{f*randn(1,1,500,1, 'single'), zeros(1,1,'single')}}, ... 
          'stride', 1, ... 
          'pad', 0) ;       
net.layers{end+1} = struct('type', 'normloss'); 

В conv-слое выход [1 1 500 1] показывает дескриптор 1x500? В слое потерь, как вы используете это значение? Должен ли слой с потерей softmax предсказать классную проблему, а затем вы найдете наивысший соответствующий класс? Или в этом случае выход [1 1 500 1] является вероятностью?

+0

Это похоже на комментарий к вопросу вместо ответа. Если вы намерены комментировать, вам нужно иметь [репутацию] (http://stackoverflow.com/help/whats-reputation) для [комментариев] (http://stackoverflow.com/help/privileges/comment) на любом после. Также проверьте это [что я могу сделать вместо этого] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i-do-instead). – thewaywewere

+0

Уровень Normloss не похож на softmax, я имею в виду, что normloss не прогнозирует какой-либо класс с наивысшей вероятностью. Он просто находит ценность. Это значение не является классом. Также в последнем слое 500 входов поступают только на 1 выход. Таким образом, мы получаем только один выход. –

+0

Так что же такое значение от fc [1 1 500 1] используется для normloss? Я имею в виду его вектор-функцию 1x500.В normloss есть расчет (input-GroundTruth). Но земля, т. Е. 5, вычитается какая? Это делает регрессию правильно? – h612

 Смежные вопросы

  • Нет связанных вопросов^_^