不能跟踪复杂的自定义深度学习层

5视图(30天)
我想让一个Matlab版本的 https://github.com/jfcrenshaw/pzflow 因为我需要工作就像深埋在Matlab工作流。我的工作代码 https://github.com/jeremylea/DLextras/tree/main/mzflow。 无论我怎么尝试,我不能让它火车。我继续这个错误: dlgradient的输入必须追踪dlarray对象或细胞数组,结构,或表包含追踪dlarray对象。要启用跟踪,使用“dlfeval” 。尽管dfeval在调用堆栈…主要定义层很复杂,只使用可学的作为输入结位置挨在样条,然后这些影响损失通过雅可比矩阵,而不是通过主要的输出。代码流test_flow - > Flow.train - > dlfeval - > loss_fun - > dlgradient。它遵循一个标准的培训路径相比,示例和自定义设置我所做的工作。
小时的调试告诉我,录音记录的所有操作在成套层,磁带上的权重矩阵,权重矩阵在录音状态时预测。然而,由bijector发现的价值。可学的呼吁dlgradient返回一个表的值不是处于记录状态(它应该在dlfeval电话吗?)。我不知道如何以及何时矩阵得到了录音状态或如果我有两份副本。谁能帮忙吗?
我试着更换与一套定制的嵌入式dlnetwork重量和偏见,没有帮助。我也试着用国家来捕获日志行列式值(这是干净了很多,是我优先设计)。我的下一个选择是找出如何使这个直接调用Python和放弃深度学习工具箱……pzflow图书馆使用JAX,不幸的是,这是很难在Windows上,这可能也意味着整个流程转移到Linux。

答案(1)

理查德。
理查德。 约19小时前
要把bijector网络传递到dlfeval数据复制在一个匿名函数的闭包。dlfeval无法看到这些数据,因为他们是私人关闭,因此不能将它们转换为输入的跟踪。您需要更改调用dlfeval所以至少dlfeval网络是一个输入:
[~,梯度]= dlfeval (@loss_fun、this.bijector this.latent, Xbat, Cbat);
它也看起来像你的实现 log_prob ,也可能 样本, 的分布。制服类可能会导致一个问题:从检查我看起来好像他们不获得跟踪链从输入输出,这将ultimtely导致损失价值不被追踪。
在log_prob,线的问题是:
log_prob = repmat(负无穷,大小(面具));
log_prob不是跟踪变量,因此它不会对下一行记录面具应用程序。我认为一个更好的实现:
函数输入= log_prob(输入),
掩码=((输入> = 0)&(输入< = 1),finddim(输入,“C”));
输入(:)=无穷;
输入(面具)= -this.input_dim *日志(1.0);
结束
我也有点怀疑的一些代码自定义层的前锋,目前还不清楚他们都是正确地跟踪他们所做的一切。例如extractdata的使用 NeuralSplineCoupling 类是一个标志,通常表明将丢失的痕迹。你可能需要编写自定义向后实现其中的一些情况。

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!