Keras:一次将多个输入馈送到一个输入层,然后在输出之前对结果求和

Keras: feed multiple inputs to ONE input layer at a time and then sum results before the output

我正在尝试将多个输入馈送到单个输入层。准确的说,是原子势。因此,NN 应该根据原子坐标(原子描述符)来预测分子的能量。

我们来喝水吧。因此,它有两个 H 原子和一个 O。 以下是 NN 的组织方式:单独输入每个化学元素的坐标(即,一个用于 H,一个用于 O)。然后这两个独立的图形会产生它们自己的局部能量。输出层是这些能量的总和,应该与目标总能量相匹配。 也就是说,这对于 OH 分子来说很容易:H 和 O 的两个平行图,每个都产生自己的原子能,然后它们连接并求和以匹配目标总能量。

但是,对于 H2(或 H2O),我有两个 H 原子。所以,我需要将一个 H 原子提供给 H-graph,然后将第二个 H 原子提供给同一个图,对它们求和,然后将它们发送到应该与目标总能量匹配的输出层。

有什么方法可以在 Keras 中执行此操作吗?

我的代码不能接受两个H:

# graph for H
input1 = keras.Input(shape=(n_cols,), name="H_element")
l1_1 = Dense(8, activation='relu')(input1)
l1_2 = Dense(1, activation='linear',name = 'H_atomic_energy')(l1_1) #atomic energy for H

# graph for O
input2 = keras.Input(shape=(n_cols,), name="O_element")
l2_1 = Dense(8, activation='relu')(input2)
l2_2 = Dense(1, activation='linear', name = 'O_atomic_energy')(l2_1) #atomic energy for O

# summation and output. Total energy is the target
x = layers.concatenate([l1_2, l2_2])
ReduceSum = Lambda(lambda z: K.sum(z, axis=1, keepdims=True))
output = ReduceSum(x)

model = keras.Model(
    inputs=[input1, input2],
    outputs=output,)

视觉描述

尝试使用 RNN:

input1 = tf.keras.Input(shape=(None, n_cols,), name="H_element")
x = tf.keras.layers.LSTM(n_cols, return_sequences=True)(input1)
l1_1 = tf.keras.layers.Dense(8, activation='relu')(x)
l1_2 = tf.keras.layers.Dense(1, activation='linear',name = 'H_atomic_energy')(l1_1) #atomic energy for H

# summation and output. Total energy is the target
ReduceSum = tf.keras.layers.Lambda(lambda z: K.sum(z, axis=1))
output = ReduceSum(l1_2)

model = tf.keras.Model(
    inputs=input1,
    outputs=output,)

您可以向其提供任意数量的元素。

我发现 TimeDistributed 层最适合我的目的,因为序列的成员通常不依赖于每个层。

model.add(layers.TimeDistributed(Dense(3)))