要把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
类是一个标志,通常表明将丢失的痕迹。你可能需要编写自定义向后实现其中的一些情况。