Keras Concatenate Layers:不同类型的连接函数之间的区别

Posted

技术标签:

【中文标题】Keras Concatenate Layers:不同类型的连接函数之间的区别【英文标题】:Keras Concatenate Layers: Difference between different types of concatenate functions 【发布时间】:2019-01-08 23:47:39 【问题描述】:

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

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

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

我知道第 2 个用于功能 API,但第 3 个有什么区别?文档似乎对此有点不清楚。

另外,对于第三个,我在下面看到了执行此操作的代码。为什么串联后一定要有._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() 等等。

【问题讨论】:

【参考方案1】:

一、后端: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

那么,Layerkeras.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 更新,此代码将中断,而正确的代码将保持正常)

【讨论】:

哇,谢谢你的详细解释!如果小写连接不是一个层,而只是一个调用大写连接的函数,那为什么还要有小写连接选项呢? 好问题....我认为这是出于历史原因,也许是为了为使用 Keras 1 的人创造更好的过渡?或者可能是因为只使用Sequential 模型的人不习惯“实例化和调用”标准?【参考方案2】:

Keras 历来支持 2 种不同的接口用于它们的层,新的功能接口和旧的接口,需要 model.add() 调用,因此有 2 种不同的功能。

对于 TF——他们的 concatenate() 函数并没有完成 Keras 工作所需的一切,因此,额外调用使 ._keras_shape 变量正确,而不是让 Keras 感到不安,因为 Keras 期望该变量具有某些特定值.

【讨论】:

以上是关于Keras Concatenate Layers:不同类型的连接函数之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

Keras Concatenate Layers:不同类型的连接函数之间的区别

Tensorflow+Keras用Tensorflow.keras的方法替代keras.layers.merge

Tensorflow+Keras用Tensorflow.keras的方法替代keras.layers.merge

text 使用Keras中的Concatenate层的shap错误示例。

tensorflow.keras.layers:ImportError:无法导入名称“CuDNNLSTM”

AttributeError:模块“tensorflow.keras.layers”没有属性“重新缩放”