问题描述
我正在尝试将多个输入提供给单个输入层。准确地说,它是一种原子势。因此,神经网络应该根据原子坐标(原子描述符)来预测分子的能量。
让我们以 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,)
视觉描述
解决方法
尝试使用 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)))