问题描述
我使用 MatLab 的机器学习工具箱训练了一个浅层 CNN。这个CNN的输入是一个图像,输出也是一个图像:f(x) = y,其中x是输入图像,y 是输出图像。 CNN 简单地读为
f(x) = ReLU(W * x + b)
其中 ReLU 是整流线性单元,* 代表卷积。
我需要自动计算CNN相对于输入的梯度x:到目前为止我尝试过
-
函数
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
而不是重铸。