首页 > 解决方案 > 为自定义损失函数创建形状与模型输出相同的 keras 张量

问题描述

我有一个 keras 模型,最后一层的输出形状是(None,574,6),这None是我输入模型的批量大小。

我还有一个名为anchorsshape的 2D numpy 数组(574,6)

我想要的是每个数据的输出减去那个 numpy 数组元素。

import keras.backend as K

anchor_tensor = K.cast(anchors, tf.float32)
print(K.int_shape(anchor_tensor))
#(576, 4)
print(K.int_shape(y_pred))
#(None, 574, 6)
y_pred - anchor_tensor

由于batch_size未知,上述代码出现以下错误。

InvalidArgumentError:尺寸必须相等,但输入形状为 [?,574,6]、[576,4] 的“sub_6”(操作:“Sub”)的尺寸为 574 和 576。

在处理上述异常的过程中,又出现了一个异常:

我怎样才能重复anchor_tensor None几次以使其形状与 相同y_pred

标签: pythontensorflowkerasloss-function

解决方案


Tensorflow 很容易做它所谓的“广播”,如果可能的话,它会自动重复丢失的元素。但要做到这一点,它必须首先确认形状允许这样做。

确保形状兼容的最安全方法是使它们具有相同的长度,并且在您希望它重复的维度中具有值 1。

所以,它很简单:

anchor_tensor = K.expand_dims(anchor_tensor, axis=0) #new shape is (1, 576, 4)   
result = y_pred - anchor tensor

现在,Tensorflow 可以匹配形状,并将重复整个批量大小的张量。


推荐阅读