【问题标题】:Deep Neural Networks, What is Alexnet output and loss function relationship?Deep Neural Networks,Alexnet 输出和损失函数的关系是什么?
【发布时间】:2017-10-20 17:48:40
【问题描述】:

我正在尝试使用 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(batch size)的特征向量,c为标签。

  1. 在损失函数中,如何比较两者? X 是一个激活,一个不是概率的向量。我猜。 C是标签,整数值范围从..0-10。那么如何比较和减去它们呢?不知道这两者有没有关系?
  2. 另外,反向传播如何比较 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

【问题讨论】:

  • 你是在做回归还是分类?这个网络似乎设置为回归,而您的任务似乎是分类。
  • 我正在尝试做回归。
  • @Matias Valdenegro
  • @Matias Valdenegro 如果这是回归,我如何使用一个值输出进行评估?

标签: matlab deep-learning regression backpropagation matconvnet


【解决方案1】:

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

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

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

L2 loss w.r.t. 的导数预测是 2*(预测 - 标签)。 这样我们就有了

Y=(X-c).*dzdy;

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

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

更多的 cmets 来了。如果您还有其他问题,请告诉我。我对 MatConvNet 很熟悉。

【讨论】:

  • 谢谢。 (1)我也很好奇X——特征向量是哪个?所以 X 的值小于 1,而 c 的值,即标签是 int [1:10]。当两者都没有联系/具有类别/性质的差异时,这种损失(X-c)将如何工作? (2)。如何在 MatconvNet.. 中添加回归的 svr 以确保回归?
  • @h612 (1) 如果 c 是 int [1:10] 那么你没有回归标签。它们是分类标签。你为什么用分类标签做 L2 损失?我猜你必须将每个整数转换为一个单热向量。网络也必须使用 one-hot 向量作为输出。 (2) 你大概可以使用LIBSVM的matlab API。 MatConvNet 没有 SVR。
  • 这是我第一次看到我的网络融合.. 我无法表达我的感激之情。我用热向量估计了输出,但结果太高了。例如,必须为 2 的 img 补丁是 10 等。这使得总体结果太大/有什么想法吗?
  • @h612 我假设 50 是批量大小。如果你有 10 个类,为什么不使用交叉熵损失进行分类?你为什么要做回归?如果你坚持做回归,你需要将c转换为1x1x10x50,X转换为1x1x10x50,这样它们的大小相同,在这种情况下你的fc9应该有conv大小[1 1 4096 10] .
  • @h612 你不应该这样做: [~,chat] = max(X,[],3) ; [~,lchat] = max(c,[],3) ;如果 c 的形状与 X 相同,直接执行 (X-c).*dzdy 即可。
猜你喜欢
  • 1970-01-01
  • 2017-12-01
  • 2019-08-19
  • 2019-10-12
  • 2018-02-26
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多