Matlab 深层神经网络,什么是网络输出和损失函数的关系?

Matlab 深层神经网络,什么是网络输出和损失函数的关系?,matlab,deep-learning,regression,backpropagation,matconvnet,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.L

我正试图通过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是标签

  • 在损失函数中,如何比较两者?X是一个激活,一个不是概率的向量。。我想是吧。C是标签,整数值范围为..0-10。例如,如何比较和减去它们呢?我不知道这两者之间是否有任何关系
  • 另外,反向传播如何比较fc9输出和标签以最小化
  • *-----------新的修正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
    
    “如果nargin==2 | |(nargin==3&&isempty(dzdy))”检查它是否为正向模式

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

    L2损耗w.r.t.预测的导数为2*(预测-标签)。 因此,我们有

    Y=(X-c).*dzdy;
    
    在你的代码中。 在这里,代码的作者不够严格,无法将常量2*。 但一般来说,它会起作用,因为它只是渐变上的一个恒定比例因子。 dzdy是下游层的梯度。如果该层是最后一层,则dzdy=1,由MatConvnet手动提供

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


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

    您是在做回归还是分类?此网络似乎设置为回归,而您的任务似乎是分类。我正在尝试进行回归。@MatiasValdenegro@Matias如果这是回归,我如何使用一个值输出进行评估?谢谢。(1) 我也对X很好奇——哪一个是特征向量?因此X的值小于1,c的值,即标签为int[1:10]。当两者没有联系/具有不同的类别/性质时,这种损失(X-c)将如何发挥作用?(2). 如何在MatconvNet中为回归添加svr..只是为了确保回归?@h612(1)如果c为int[1:10],则没有回归标签。它们是分类标签。你为什么要用分类标签做L2损失?我想你必须把每个整数转换成一个热向量。此外,网络必须使用一个热向量作为输出。(2) 您可能可以使用LIBSVM的matlabapi。MatConvNet没有SVR。这是我第一次看到我的网络融合。。我无法表达我的感激之情。我已经用hotvector对输出进行了估计,但是结果太高了。e、 e必须为2的img补丁是10,等等。这使得覆盖结果太大/有什么想法吗?@h612我假设50是批量大小。如果你有10个类,为什么不使用交叉熵损失进行分类呢?为什么要做回归?如果你坚持要做回归,你需要把c转换成1x1x10x50,把X转换成1x10x50,这样它们的大小是相同的,在这种情况下,你的fc9应该有conv size[1 1 4096 10]。@h612你不应该这样做:[~,chat]=max(X,[],3);[~,lchat]=max(c,[],3);如果c的形状与X相同,只需直接执行(X-c)。*dzdy。
    Y=(X-c).*dzdy;