【问题标题】:Is there any automatic way in MatLab for computing the gradient of a CNN wrt the inputs?MatLab 中是否有任何自动方法可以计算输入的 CNN 梯度?
【发布时间】:2021-03-02 19:02:37
【问题描述】:

我使用 MatLab 的机器学习工具箱训练了一个浅层 CNN。该 CNN 的输入是图像,输出也是图像:f(x) = y,其中 x 是输入图像,y em> 是输出图像。 CNN 简单地读作

f(x) = ReLU(W * x + b)

其中ReLU是整流后的线性单元,*代表卷积。

我需要自动计算 CNN 相对于输入 x 的梯度:到目前为止我尝试过

  • 函数fpderiv:但这会计算性能相对于网络权重和偏差的导数。

  • 函数dlgradient:这个函数通常用于计算梯度wrt权重和偏差,所以我天真地尝试调整它来计算输入梯度:

    function gradients = nngrad(dlnet,a)

    a = dlarray(single(a),'SSCB');

    a_pre = forward(dlnet,a);

    gradients = dlgradient(a_pre(1),dlnet.Layers(1));

    end

通过gradients = dlfeval(@nngrad,dlnet,A);调用上述函数,其中dlnet是一个dlnetwork对象。上面的版本计算输入图像第一个元素的梯度。我收到以下错误:

使用 dlfeval 时出错(第 43 行) 'dlgradient' 输入必须是跟踪的 dlarray 对象或元胞数组、结构或表 包含跟踪的 dlarray 对象。要启用跟踪,请使用“dlfeval”。

我查看了 MatLab 的文档,是否有某种方法可以将 Layer 对象转换为 dlarray 或类似策略,但我没有成功。

有什么方法可以正确使用dlgradient 函数吗?或者是否有任何内置函数可以计算神经网络相对于输入的梯度?


这是一个非常简单的 CNN,它的梯度可以用一点张量代数来计算,但我有兴趣找到一个函数,它可以自动计算更深 CNN 的输入的梯度。

【问题讨论】:

    标签: matlab deep-learning conv-neural-network automatic-differentiation


    【解决方案1】:

    您不应在调用dlgradient 的同一函数中将a 转换为dlarray。 尝试将a 作为dlarray 传递给nngrad,而不是重铸。

    【讨论】:

      猜你喜欢
      • 2019-05-01
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 2018-10-17
      • 1970-01-01
      • 2013-09-10
      • 2021-03-20
      相关资源
      最近更新 更多