我最近才开始与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(),依此类推。
答案 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
然后,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])
这不适用于顺序模型,除非上一层输出一个列表(这是可能的,但并不常见)。
最后,来自图层模块的连接功能: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感到不安。有一些特殊的价值。