【问题标题】:Keras: feed multiple inputs to ONE input layer at a time and then sum results before the outputKeras:一次将多个输入输入到一个输入层,然后在输出之前对结果求和
【发布时间】:2021-02-08 04:02:39
【问题描述】:

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

让我们以 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, 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,)

视觉描述

【问题讨论】:

    标签: python keras deep-learning neural-network chemistry


    【解决方案1】:

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

    你可以给它提供任意数量的元素。

    【讨论】:

    • 安德烈,谢谢你的提示!我已经尝试过 SimpleRNN,它返回一个序列。然而,RNN 中存在影响序列下一个成员的经常性权重。我可以将 recurent_initializer 设置为零,但无论如何这些权重都会在训练期间更新。有没有办法只冻结经常性的权重?我在互联网上发现的是你只能冻结整个图层,这不是我需要的。
    • @maksim 所有 RNN 权重都是“循环的”。你不能冻结它们
    • @maksim 尝试添加一些氢作为附加输入
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 2017-12-11
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      相关资源
      最近更新 更多