错误表明
inputs
和anchors
的形状在执行减法运算时仍然不兼容。这种情况通常发生在尝试对两个形状不同的张量进行元素操作时。我们需要进一步调整这两个张量的形状以确保它们能够正确进行广播。
从错误信息看,inputs
的形状变为 [32, 1, 8]
(批次大小为32,维度为8),而 anchors
的形状为 [4, 8, 1]
。我们希望 anchors
在第一维(类别维度)进行广播,因此需要调整 anchors
的形状,使其在中间维度广播,而不是在最后一个维度。
下面是正确调整形状的方法:
class DistanceLayer(Layer):
def __init__(self, anchors, **kwargs):
super().__init__(**kwargs)
self.anchors = tf.constant(anchors, dtype=tf.float32)
def call(self, inputs):
# 将inputs形状从[batch_size, features]调整为[batch_size, 1, features]
inputs_expanded = tf.expand_dims(inputs, 1)
# 将anchors形状从[num_anchors, features, 1]调整为[1, num_anchors, features]
anchors_expanded = tf.expand_dims(self.anchors, 0)
# 计算距离
return tf.norm(inputs_expanded - anchors_expanded, axis=2)
这段代码中,我添加了对 anchors
的形状调整,使其在计算中可以正确地在批次大小维度进行广播。现在,当你的 inputs
和 anchors
进行减法运算时,anchors
在批次大小维度(batch_size
)自动扩展,而 inputs
在类别维度(num_anchors
)自动扩展,使得两者能够在特征维度(features
)上对齐并进行计算。