Python Keras连接层:不同类型连接函数之间的差异
我最近刚开始玩Keras,开始制作自定义图层。但是,我对许多不同类型的层感到相当困惑,这些层的名称略有不同,但功能相同 例如,和中有3种不同形式的连接函数 我知道第二个用于函数API,但这三个之间有什么区别?文件似乎对此有点不清楚 另外,对于第三个,我在下面看到了一个这样做的代码。为什么在连接之后一定要有线条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
# 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的人创造一个更好的过渡?或者可能是因为只使用顺序模型的人不习惯“实例化并调用”标准?