我需要实现一个自定义层(在Tensorflow或Keras中),该层将生成具有可学习参数(方差)的2d高斯热图。我希望该层将每个样本的中心作为地面真实地标坐标,作为它们的输入和输出2d高斯图像。 但是,我不确定如何实现它,因为我必须遍历样本数量,而在样本数量为“无”的情况下,在使用“调用”方法进行编译时是不可能的。 更具体地说,如果只有一个样本,这就是我生成热图的方式:
def call(self,landmark):
x, y = tf.meshgrid(tf.linspace(-100.0,100.0,128), tf.linspace(-100.0,100.0,128))
d = tf.sqrt((x-landmark[0])**2+(y-landmark[1])**2)
g=tf.exp(-tf.square(d)/(2*self.sigma**2))/(2*np.pi*self.sigma)
return g
但是,假设界标最初是形状为(None,2)的输入张量,那么我该如何实现一个为每个样本输出对应结果的层?
答案 0 :(得分:0)
我想出了一个答案,我不确定它的效果如何: 您可以列出二维恒定网格图像和地标的列表,然后同时将它们作为输入传递,那么调用函数将是:
def call(self, x):
image, landmark = x
sub = image - landmark
sigma = self.kernel
d = KB.sqrt((sub[:, :, :, 0]) ** 2 + (sub[:, :, :, 1]) ** 2)
g = tf.exp(-tf.square(d) / (2 * sigma ** 2)) / (2 * np.pi * sigma)
return g