我一直在尝试使用Keras使用LSTM网络对非线性动力系统进行建模。我仅通过使用Keras LSTM网络就获得了成功,在该网络中,我定义了输入/输出关系,类似于以下伪代码:
x[t] = NN(y[t-200:t],x[t-200-1:t-1])
其中 y 是我的强制函数,而 x 是我要使用的变量。所以我用过去的200点来估算下一个点。我通过将新预测的点添加到“过去的输出”向量中来递归地执行此操作。
现在,我想向损失函数添加一些有关我要求解的PDE的信息,因此我需要计算时间的导数。我已阅读this answer和相关的答案以开始使用,但似乎无法使该工作流程与LSTM一起使用。首先,时间不是我的工作流程中的显式变量,因此我需要将其添加为输入,以使工作流程适应该答案。
所以我可以将 time 向量添加到输入列表中,然后尝试计算相对于输入的输出导数:
_df1 = grad(model.output,model.input)
df1 = tf.Print( _df1, [ _df1 ], message = "df1" )
作为参考,我的输入尺寸为(?,200,3),而我的输出尺寸仅为(?,1)。上面的代码有效,我得到了一个(?,200,3)张量。但是当我尝试像这样计算二阶导数时:
_df2 = grad(df1,model.input)
df2 = tf.Print( _df2, [ _df2 ], message = "df2" )
然后我得到了错误: TypeError:不支持while循环的二阶渐变。
由于我只需要在当前时间步(t)上使用导数,所以我尝试了对张量进行切片,但这也不起作用。
_df2 = grad(df1[:,-1,-1],model.input)
df2 = tf.Print( _df2, [ _df2 ], message = "df2" )
即使我可以做类似的事情,我也不愿意添加 time 向量作为显式输入。我已经考虑过使用 diff()(给定dt)以数值方式计算导数,但是我不确定在处理张量时如何在此进行计算。
因此,我希望能有任何建议或想法来帮助我解决此问题。最终,我想将PDE的同质部分添加到损失函数中。在这一点上,我的等式仅具有关于时间的导数。
谢谢。