Я пытаюсь собрать набор данных 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}] = ...
, что я должен сделать для решения этой проблемы? спасибо
> Я пытаюсь подготовить набор данных MNIST с одним выходом Не делайте этого. Использование регрессии для задач классификации - плохая идея. –
Я знаю, что это плохая идея, но я должен это делать –
Я сделал то, что вы сказали, я имею в виду, что я изменил vl_simplenn и использовал потерю нормы как последний слой, но все же, когда я тренирую сеть, на выходе она говорит, что это softmaxloss и он не использует normloss. вы не знаете, почему это происходит? –