首先,后端:tf.keras.backend.concatenate()
后端功能应该在“内部”层中使用。您只能在
Lambda图层,自定义图层,自定义损失函数,自定义指标等中使用此功能。
它直接作用于“张量”。
如果您不深入定制,这不是选择。(这在您的示例代码中是一个错误的选择-请参阅最后的详细信息)。
如果深入研究keras代码,您会注意到该
Concatenate层在内部使用此功能:
import keras.backend as Kclass 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 tensorsoutputTensor = keras.layers.Concatenate(axis=someAxis)([inputTensor1, inputTensor2])
除非上一层输出列表,否则这不适用于顺序模型(这是可能的,但并不常见)。
最后,来自layers模块的连接函数: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,则此代码将中断,而正确的代码将保持正常)



