我正在尝试用单输出训练MNIST数据集。这意味着当我给出28 * 28输入(图像)时,模型给出了一个正数。例如我给'5',模型给我结果4.9,5,5.00或接近5.所以我有一些红色的文件。人们告诉softmaxlayer必须用回归层进行更改。这样做。我正在使用matconvnet库及其mnist示例。我已经改变了我的网络和写回归层丢失功能。这些是我的代码:
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和X不兼容 过滤器。
vl_simplenn出错(第415行) [res(i).dzdx,dzdw {1},dzdw {2}] = ...
我必须做些什么才能解决这个问题?谢谢
答案 0 :(得分:0)
我找到了解决方案。我犯了一个错误。在vl_simplenn脚本中有2个不同的行必须更改,但我只更改了一行。这段代码有效。
答案 1 :(得分: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');
在转换层中,输出[1 1 500 1]显示1x500的描述符?在损失层你如何使用该值?损失层softmax不应该预测类概率然后你找到最高的概率对应类?或者在这种情况下,[1 1 500 1]的输出是概率?