Python Keras连接层:不同类型连接函数之间的差异

Python Keras连接层:不同类型连接函数之间的差异,python,keras,keras-layer,Python,Keras,Keras Layer,我最近刚开始玩Keras,开始制作自定义图层。但是,我对许多不同类型的层感到相当困惑,这些层的名称略有不同,但功能相同 例如,和中有3种不同形式的连接函数 我知道第二个用于函数API,但这三个之间有什么区别?文件似乎对此有点不清楚 另外,对于第三个,我在下面看到了一个这样做的代码。为什么在连接之后一定要有线条 # Concatenate the summed atom and bond features atoms_bonds_features = K.concatenate([atoms, s

我最近刚开始玩Keras,开始制作自定义图层。但是,我对许多不同类型的层感到相当困惑,这些层的名称略有不同,但功能相同

例如,和中有3种不同形式的连接函数

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

另外,对于第三个,我在下面看到了一个这样做的代码。为什么在连接之后一定要有线条

# 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(),等等。

Keras历史上为其层支持两个不同的接口,新的功能接口和旧的接口,这需要调用
model.Add()
,因此有两个不同的函数


对于TF——它们的
concatenate()
函数并没有完成Keras工作所需的一切,因此,额外的调用使
\u Keras\u shape
变量正确,并且不会打乱期望该变量具有某个特定值的Keras。

首先,后端:
TF.Keras.backend.concatenate()

后端函数应该在“内部”层中使用。您只能在
Lambda
层、自定义层、自定义损耗函数、自定义度量等中使用此选项

它直接作用于“张量”

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

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

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(输入,轴=-1)

这不是一个层。这是一个函数,它将返回内部
连接层产生的张量

atoms_bonds_features = Concatenate(axis=-1)([atoms, summed_bond_features])   
#just this line is perfect
代码很简单:

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

旧函数 在keras1中,人们的功能是接收“层”作为输入并返回输出“层”。他们的名字与
merge
word有关

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


为什么是
\u keras\u形状
字? 这个后端函数不应该在高级代码中使用。编码器应该使用
连接层

atoms_bonds_features = Concatenate(axis=-1)([atoms, summed_bond_features])   
#just this line is perfect
Keras层将
\u Keras\u shape
属性添加到其所有输出张量,Keras使用此属性推断整个模型的形状

如果在层或损耗/度量之外使用任何后端函数,则输出张量将缺少此属性,并且会出现一个错误,告知
\u keras\u shape
不存在


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

Wow,感谢您的详细解释!如果小写连接不是一个层,只是一个调用大写连接的函数,那么为什么还要使用小写连接选项呢?好问题。。。。我认为这是出于历史原因,也许是为了给那些使用Keras 1的人创造一个更好的过渡?或者可能是因为只使用
顺序
模型的人不习惯“实例化并调用”标准?