python - Keras 连接层 : Difference between different types of concatenate functions

标签 python keras keras-layer

我最近才开始使用 Keras 并开始制作自定义图层。然而,我对名称略有不同但功能相同的许多不同类型的图层感到困惑。

例如,https://keras.io/layers/merge/ 中有 3 种不同形式的连接函数和 https://www.tensorflow.org/api_docs/python/tf/keras/backend/concatenate

keras.layers.Concatenate(axis=-1)
keras.layers.concatenate(inputs, axis=-1)
tf.keras.backend.concatenate()

我知道第二个用于函数式 API,但第三个有什么区别?文档对此似乎有点不清楚。

此外,对于第三个,我在下面看到了执行此操作的代码。为什么拼接后一定要有._keras_shape这一行?

# Concatenate the summed atom and bond features
atoms_bonds_features = K.concatenate([atoms, summed_bond_features], axis=-1)

# Compute fingerprint
atoms_bonds_features._keras_shape = (None, max_atoms, num_atom_features + num_bond_features)

最后,在 keras.layers 下,似乎总是有 2 个重复项。例如Add()和add()等。

最佳答案

首先是后端:tf.keras.backend.concatenate()

后端函数应该在“内部”层中使用。您只能在 Lambda 层、自定义层、自定义损失函数、自定义指标等中使用它。

它直接作用于“张量”。

如果您不深入进行定制,那么这不是您的选择。 (在您的示例代码中这是一个错误的选择——请参阅末尾的详细信息)。

如果深入研究 keras 代码,您会注意到 Concatenate 层在内部使用此函数:

import keras.backend as K
class Concatenate(_Merge):  
    #blablabla   
    def _merge_function(self, inputs):
        return K.concatenate(inputs, axis=self.axis)
    #blablabla

然后,:keras.layers.Concatenate(axis=-1)

与任何其他 keras 层一样,您可以在张量实例化调用它。

非常简单:

#in a functional API model:
inputTensor1 = Input(shape) #or some tensor coming out of any other layer   
inputTensor2 = Input(shape2) #or some tensor coming out of any other layer

#first parentheses are creating an instance of the layer
#second parentheses are "calling" the layer on the input tensors
outputTensor = keras.layers.Concatenate(axis=someAxis)([inputTensor1, inputTensor2])

这不适用于顺序模型,除非前一层输出一个列表(这是可能的但不常见)。


最后,层模块中的连接函数:keras.layers.concatenate(inputs, axis=-1)

不是层。这是一个将返回由内部 Concatenate 层产生的张量的函数。

代码很简单:

def concatenate(inputs, axis=-1, **kwargs):
   #blablabla
   return Concatenate(axis=axis, **kwargs)(inputs)

旧函数

在 Keras 1 中,人们拥有旨在接收“层”作为输入并返回输出“层”的函数。他们的名字与 merge 词有关。

但由于 Keras 2 没有提及或记录这些,我可能会避免使用它们,如果发现旧代码,我可能会将其更新为正确的 Keras 2 代码。


为什么是 _keras_shape 词?

此后端函数不应在高级代码中使用。编码器应该使用 Concatenate 层。

atoms_bonds_features = Concatenate(axis=-1)([atoms, summed_bond_features])   
#just this line is perfect

Keras 层将 _keras_shape 属性添加到它们的所有输出张量,Keras 使用此属性来推断整个模型的形状。

如果您在层或损失/指标“外部”使用任何后端函数,您的输出张量将缺少此属性,并且会出现错误,告知 _keras_shape 不存在。

编码器通过手动添加该属性创建了一个糟糕的解决方法,而该属性本应由适当的 keras 层添加。 (这现在可能有效,但如果 keras 更新,此代码将中断,而正确的代码将保持正常)

关于python - Keras 连接层 : Difference between different types of concatenate functions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51632716/

相关文章:

Python:将计数器写入 csv 文件

python - 将 OptimizeWarning 作为异常捕获

java - 使用 jython 在 Python 中实例化对象与 Java 相同

keras - 如何在 keras 中实现 Conv1DTranspose?

tensorflow - Keras:自定义损失函数,训练数据与模型不直接相关

tensorflow - Dropout 层在测试/训练阶段的行为

python - 计算运行scrapy的总时间

python - Keras ImageDataGenerator 重新缩放参数如何工作?

tensorflow - 如何将 tensorflow 对象包装为 Keras 层?

python - Keras:具有多个参数的 Lambda 层函数