【问题标题】:how to change softmaxlayer with regression in matconvnet如何在 matconvnet 中使用回归改变 softmaxlayer
【发布时间】:2017-05-08 22:38:21
【问题描述】:

我正在尝试使用单输出训练 MNIST 数据集。这意味着当我给一个 28*28 的输入(图像)时,模型给了我们一个公正的数字。例如我给'5',模型给我的结果是4.9,5、5.002或接近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 脚本

但是当我运行 train 时会出现这个错误

错误使用 vl_nnconv DEROUTPUT 维度与 X 和 过滤器。

vl_simplenn 中的错误(第 415 行) [res(i).dzdx, dzdw{1}, dzdw{2}] = ...

我必须做些什么来解决这个问题?谢谢

【问题讨论】:

  • > 我正在尝试使用单输出训练 MNIST 数据集 不要那样做。对分类任务使用回归是个坏主意。
  • 我知道这是个坏主意,但我必须这样做
  • 我按照你说的做了,我的意思是我改变了 vl_simplenn 并使用 norm loss 作为最后一层,但是当我训练网络时,在输出中,它说它是 softmaxloss,它没有使用 normloss。你知道为什么会这样吗?
  • 可能 Softmaxloss 没有随着您的代码中的 normloss 发生变化,您可以在 vl_simplenn 脚本中检查前馈和后向部分的函数名称(normloss softmaxloss)。还要检查您的 cnn_init 脚本。你的错误看起来很简单,但我不知道确切

标签: regression deep-learning mnist loss matconvnet


【解决方案1】:

我有个问题。

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');

在conv层输出[1 1 500 1]显示一个1x500的描述符?在损失层你如何使用那个值?损失层softmax不应该预测类概率然后找到最高概率对应的类吗?或者在这种情况下 [1 1 500 1] 的输出是概率?

【讨论】:

  • 这看起来像是对问题的评论而不是答案。如果您打算发表评论,您需要在任何帖子上拥有足够的reputationcomment。还要检查这个what can I do instead
  • Normloss 层与 softmax 不同,我的意思是 normloss 不会使用最高概率预测任何类别。它只是找到一个值。这个值不是类概率。同样在最后一层,500 个输入只有 1 个输出。所以我们只得到一个输出。
  • 那么 fc [1 1 500 1] 的值是多少?我的意思是它的特征向量 1x500。在 normloss 中有一个计算(input-GroundTruth)。但是groundtruth,例如5、减表是什么?这是在做回归吧?
【解决方案2】:

我找到了解决方案。我犯了一个错误。 VL_SIMPLenn脚本中有2个不同的线路必须更改,但我只更改了一行。此代码有效。

【讨论】:

    猜你喜欢
    • 2016-07-10
    • 2015-06-12
    • 1970-01-01
    • 2015-03-25
    • 2022-11-29
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多