MatLab 中是否有任何自动方法来计算输入的 CNN 的梯度?

问题描述

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

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

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

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

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

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

    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”。

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

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


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

解决方法

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...