Keras连接层:不同类型的连接功能之间的差异

时间:2018-08-01 11:58:12

标签: python keras keras-layer

我最近才开始与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()

我知道第二个用于功能性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(),依此类推。

2 个答案:

答案 0 :(得分:8)

首先,后端: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更新的情况下,此代码将中断,而正确的代码将保持正常)

答案 1 :(得分:1)

Keras过去在其层上支持2个不同的接口,新的功能和旧的接口需要router-outlet调用,因此需要2个不同的功能。

对于TF来说,它们的model.add()函数无法执行Keras正常运行所需的所有操作,因此,需要进行额外的调用来使concatenate()变量正确,并且不会使期望该变量变大的Keras感到不安。有一些特殊的价值。