深度神经网络,什么是Alexnet输出和损失函数关系?

时间:2017-05-20 18:50:20

标签: matlab deep-learning regression backpropagation matconvnet

我试图通过Matconvnet DagNN了解DNN。我有一个基于以下最后两层网的问题,它使用欧几里德损失进行回归

net.addLayer('fc9', dagnn.Conv('size', [1 1 4096 1], 'hasBias', true, 'stride', [1,1], 'pad', [0 0 0 0]), {'drop8'}, {'prediction'},  {'conv10f'  'conv10b'});
 net.addLayer('l2_loss', dagnn.L2Loss(), {'prediction', 'label'}, {'objective'});

L2Loss的代码是

function Y=vl_nnL2(X,c,dzdy)
 c=reshape(c,size(X));
 if nargin == 2 || (nargin == 3 && isempty(dzdy))
    diff_xc=(bsxfun(@minus, X,(c)));
    Y=diff_xc.^2;
 elseif nargin == 3 && ~isempty(dzdy)
    Y=(X-c).*dzdy;
 end
end

X是fc9图层的输出,它是长度为100(批量大小)的特征向量,c是标签。

  1. 在损失函数中,如何比较两者? X是一个激活,一个不是概率的向量..我猜。 C是标签,整数值范围为...... 0-10。那么他们怎么能比较和减去呢?我不知道这两者之间是否有任何关系?
  2. 此外,反向传播如何比较fc9输出和最小化标签?
  3. * -----------新修改的L2回归函数

    function Y=vl_nnL2_(X,c,dzdy)
        c=reshape(c,size(X));
        [~,chat] = max(X,[],3) ;
        [~,lchat] = max(c,[],3) ; 
    if nargin == 2 || (nargin == 3 && isempty(dzdy))
          t = (chat-lchat).^ 2 ;
         Y=sum(sum(t));
    elseif nargin == 3 && ~isempty(dzdy)
      ch=squeeze(chat);
      aa1=repmat(ch',35,1);
      lch=squeeze(lchat);
      aa2=repmat(lch',35,1);
      t = (chat-lchat);
      Y = dzdy.*(aa1-aa2)*2;
    Y = single(reshape(Y,size(X)));
    
    end
    end
    

    enter image description here

1 个答案:

答案 0 :(得分:0)

“if nargin == 2 ||(nargin == 3&& isempty(dzdy))”检查它是否为正向模式。

在正向模式下,您计算(预测 - 标签)。^ 2:

diff_xc=(bsxfun(@minus, X,(c)));
Y=diff_xc.^2;

L2损失的衍生物w.r.t.预测是2 *(预测 - 标签)。 因此我们有

Y=(X-c).*dzdy;
你的代码中的

。 在这里,你的代码的作者不够严谨,不能把常量2 *。 但总的来说它会起作用,因为它只是渐变的恒定比例因子。 dzdy是来自下游层的梯度。如果这个图层是最后一个,dzdy = 1,由MatConvnet手动提供。

c必须与X的大小相同,因为它的'回归。

更多评论即将发布。如果您有其他问题,请告诉我。我对MatConvNet非常熟悉。