我有一堆图像被分组为以下形状的张量:
> images.shape
产生(2000, 1440, 1, 16)
,其含义是(rows, cols, channels, images_count)
现在,为了简化说明,我需要对将由一个图像(即(2000, 1440, 1)
)产生的那些图像进行加权求和。
实际上有多组权重(超过128个),这意味着在16张输入图像中,我获得了128张合并图像,而不是仅根据图像大小判断是繁重的操作。
因此,我正在寻找使我能够以最少的临时性和消耗的内存量快速高效地执行操作的方法/想法。
TF中是否有任何机制可以有效且快速地执行此操作?
提前谢谢!
答案 0 :(得分:0)
为简单起见,假设您有8个不同的权重组,并且数据采用您指定的格式。
首先,我们将图像转换为常规的batch_size
第一形式。当我们在图像和权重之间进行逐元素乘法时,我们通过添加第二个来支持广播来扩展图像的尺寸。最后,我们通过计算每个权重组的图像(已加权)总和来减小一维空间。
import tensorflow as tf
import numpy as np
x = tf.placeholder(tf.float32, shape=(2000, 1440, 1, None))
w = tf.placeholder(tf.float32, shape=(None, 2000, 1440, 1))
xtransposed = tf.transpose(x, perm=[3, 0, 1, 2]) # n_samples first
xexpanded = tf.expand_dims(xtransposed, 1) # expand for broadcasting
multiplied = xexpanded * w
reduced = tf.reduce_sum(multiplied, axis=0) # weighted sum over all images
images = np.random.normal(size=(2000, 1440, 1, 16))
weights = np.random.normal(size=(8, 2000, 1440, 1))
with tf.Session() as sess:
res = sess.run(reduced, feed_dict={x:images, w:weights})
print(res.shape) # (8, 2000, 1440, 1)
res
现在以numpy格式存储8个不同权重组的加权总和。