我有张量流/ 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中执行此操作?
从你的描述中不太清楚,但我认为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之间的差异。
然后,您可以过滤以查找所需的元素。