Tensorflow / Keras找到两个最相似的过滤器

时间:2018-09-05 17:07:33

标签: tensorflow keras

我有一个Tensorflow / Keras CNN。它具有图层,其中一些是Conv2D。在给定的层中,我想有效地找到Conv2D中最相似的两个过滤器。 layer.weights是一个形状(高度,宽度,深度)filter_count long的列表。 我想按差异进行比较,或者按(高度,宽度,深度)中每个元素之间的sqrt(diff ^ 2)进行比较,然后求和,以使差异为单个浮点值。

如果T1是thelayer.weights [idx1],而T2是thelayer.weights [idx2] 那么比较就是tf.sqrt(tf.reduce_sum(tf.squared_difference(T1,T2)))

我想将每个过滤器与其他每个过滤器进行比较,并采用3个最低的差异。 (如果T1和T2是相同的张量,则第一个始终为零)

很明显,我可以进行嵌套循环,但这不起作用且不美观。

是否有一些内置的tensorflow或keras函数可以在GPU中快速完成此任务?

1 个答案:

答案 0 :(得分:1)

从您的描述中还不清楚,但是我假设weights的形状为[filter_count,height,width,depth]。如果filter_count沿不同的轴,则必须相应地修改“ reduce_sum”的参数。

您可以使用广播来并行化此过程。

differences = tf.sqrt(
    tf.reduce_sum(
      tf.squared_difference(
        tf.expand_dims(thelayer.weights,0), 
        tf.expand_dims(thelayer.weights,1),

        ),
      (-1,-2,-3)
    )
)

这将导致一个张量为[filter_count,filter_count]的张量,其中元素differences[i, j]测量滤波器权重i和j之间的差。

然后您可以进行过滤以找到所需的元素。