我有一个张量列表,比如说列表长200,张量为3x3x3。 我想要每个张量和所有其他张量之间的差异。 结果是一个三角形矩阵,它是一个列表列表。 List [0]的长度为0,list [1]的长度为1,list [2]的长度为2,以此类推,为200。 所以list [5] [2]是第六张和第三张量之间的差。
我有一个差函数
reduce_sum(abs(squared_difference(a,b)))
但是可以是任何比较。 如果尚未计算答案,则将值设置为-1,并标记为根据需要进行计算。因此它是按需计算。
总体思路是找到两个3x3x3(或其他形状)矩阵,这些矩阵与我到目前为止在此CNN层上看到的所有矩阵中最相似。
我目前使用嵌套的for循环来找到最小的差异,例如:
for i in range(ly.filters):
for k in range(i + 1, ly.filters):
d = get_filter_diff(ly, i, k, mysession)
if d < bdiff:
bdiff = d
bidxa = i
bidxb = k
get_filter_diff是
assert idxa != idxb
# Always have idxa always greater than idxb
if idxa < idxb:
t = idxa
idxa = idxb
idxb = t
diff = ly.odiff_filter_diffs[idxa][idxb]
if diff == -1.0:
s = tf.reduce_sum(tf.squared_difference(ly.odiff_mutable_weights[idxa],
ly.odiff_mutable_weights[idxb]))
diff = s.eval(session=mysession )
ly.odiff_filter_diffs[idxa][idxb] = diff
return diff
这非常耗时。应该可以用一小段代码就能做到这一点,以便使用GPU或多个CPU,这是最佳选择。
我也对
切成的10000张图像(nist集32x32x3)进行了此操作ptchs = tf.extract_image_patches(img, ksizes=[1, 3, 3, 1], strides=[1, 1, 1, 1], rates=[1, 1, 1, 1], padding='VALID')
因此,整个测试的顺序约为10000 x 900。 当命中率很差时,我替换一个补丁,将所有差异设置为1,然后合并其他差异补丁和平均值。因此,我经常清空三角矩阵中的一行,以根据需要重新计算该差异行。
以某种方式,我认为在台式机上使用所有这些芯片应该很快! 相反,我坚持使用串行处理模型和一个CPU。
有什么想法吗?