【发布时间】: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