Keras:一次将多个输入提供给一个输入层,然后在输出之前对结果求和

问题描述

我正在尝试将多个输入提供给单个输入层。准确地说,它是一种原子势。因此,神经网络应该根据原子坐标(原子描述符)来预测分子的能量。

让我们以 H2O 为例。因此,它有两个 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,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,)

视觉描述

The visual description

解决方法

尝试使用 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)))