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

Lim*_*huo 11 python keras keras-layer

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

例如,https://keras.io/layers/merge/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()
Run Code Online (Sandbox Code Playgroud)

我知道第二个用于功能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)
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*ler 11

一,后端: 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
Run Code Online (Sandbox Code Playgroud)

然后,Layer: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])
Run Code Online (Sandbox Code Playgroud)

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


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

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

代码很简单:

def concatenate(inputs, axis=-1, **kwargs):
   #blablabla
   return Concatenate(axis=axis, **kwargs)(inputs)
Run Code Online (Sandbox Code Playgroud)

较旧的功能

在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
Run Code Online (Sandbox Code Playgroud)

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

如果您在层外或损失/度量标准"外部"使用任何后端函数,则输出张量将缺少此属性,并且将显示错误,告知_keras_shape不存在.

编码器通过手动添加属性来创建一个不好的解决方法,当它应该由适当的keras层添加时.(这可能现在可以使用,但是在keras更新的情况下,此代码将会中断,而正确的代码将保持正常)