我有一个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中快速完成此任务?
答案 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之间的差。
然后您可以进行过滤以找到所需的元素。