使用 Keras 动态展开简单神经网络

Dynamic Unrolling of Simple Neural Nets using Keras

我正在尝试复制一个神经网络来计算分子的能量(下图)。能量是 bonded/non-bonded 相互作用和 angle/dihedral 应变的总和。我有 4 个独立的神经网络,它们找出每一个产生的能量,总能量是每次相互作用产生的能量总和,可能有 100 个。在我的数据集中,我只知道总能量。

如果我的总能量是在不同的神经网络上使用多个(未知数,由分子决定)forward-pos计算的,我如何让keras通过动态构造的总和进行反向传播。非 keras Tensorflow 方法也可以。 (如果我事先知道会有多少键,我会把神经网络的输出加在一起,问题是必须在运行时展开神经网络的副本)。

这只是论文中给出的示例图像:

综上所述,问题是:"How do I implement dynamic unrolling and feed it to a sum in Keras?"。

如果其中一个维度未知,可以为 Keras 层指定 (None, actual-shape...) 的形状。然后我们可以使用 TensorFlow 层使用 tf.reduce_sum(layer, axis=0) 对索引为 0 的轴求和。因此动态层大小在 Keras 中并不难实现。

然而,如果输入形状构成更多的约束,我们可以传入附加虚拟 0 值的完整矩阵和掩码矩阵,然后我们可以使用 tf.multiply 拒绝虚拟值,反向传播当然会自动工作。