如何在张量流中将加权和作为张量运算?

How to do weighted sum as tensor operation in tensorflow?

我正在尝试在张量流中对矩阵进行加权求和。 不幸的是,我的尺寸不小,而且我的记忆力有问题。另一种选择是我做的事情完全错了

我有两个张量 U,形状为 (B,F,M) 和 A,形状为 (C,B)。我想做加权总和和堆叠。

加权和

对于 C 中的每个索引 c,我有来自 A 的权重向量 a,形状为 (B,)。 我想将它用于 U 的加权和以获得形状为 (F, M) 的矩阵 U_t。这与 this 非常相似,我在其中找到了一些小帮助。

串联

不幸的是,我想对 A 中的每个向量 a 执行此操作以获得 C 矩阵 U_tc 在列表中。 U_tc 提到了形状(F,M)。之后我连接列表中的所有矩阵以获得形状为 (C*F,M)

的超矩阵

我的值是 C=2500,M=500,F=80,B=300

一开始,我尝试了很多循环和元素选择的非常幼稚的方法,产生了很多操作。 现在在 this 的帮助下,我有以下内容:

U = tf.Variable(tf.truncated_normal([B, F, M],stddev=1.0 ,dtype=tf.float32) #just for example
A = tf.Variable(tf.truncated_normal([C, B],stddev=1.0) ,dtype=tf.float32) #just for example

U_t = []

for ccc in xrange(C):
    a = A[ccc,:]
    a_broadcasted = tf.tile(tf.reshape(a,[B,1,1]), tf.stack([1,F,M]))
    T_p.append(tf.reduce_sum(tf.multiply(U,a_broadcasted), axis=0))


U_tcs = tf.concat(U_t,axis=0)

不幸的是,这是由于内存错误而失败。不知道是我做错了什么,还是因为计算有太多的数学运算?因为我认为...变量对于内存来说不会太大,对吧?至少,我之前有更大的变量,还可以。 (我有 16 GB GPU 显存)

我做的那个加权和正确吗?

知道如何更有效吗?

如有任何帮助,我将不胜感激。谢谢

1.加权和和串联

当内存不受限制时,您可以直接使用向量运算而无需循环。

import tensorflow as tf

C,M,F,B=2500,500,80,300
U = tf.Variable(tf.truncated_normal([B, F, M],stddev=1.0 ,dtype=tf.float32)) #just for example
A = tf.Variable(tf.truncated_normal([C, B],stddev=1.0) ,dtype=tf.float32) #just for example

# shape=(C,B,1,1)
A_new = tf.expand_dims(tf.expand_dims(A,-1),-1)
# shape=(B,F,M)
U_t = tf.reduce_sum(tf.multiply(A_new , U),axis=1)

# shape=(C*F,M)
U_tcs = tf.reshape(U_t,(C*F,M))

2。内存错误

其实我在运行上述代码的时候也出现了内存错误

ResourceExhaustedError (see above for traceback): OOM when allocating tensor with shape[2500,300,80,500]...

稍微修改一下上面的代码,它就可以在我的 8GB GPU 内存上正常工作了。

import tensorflow as tf

C,M,F,B=2500,500,80,300
U = tf.Variable(tf.truncated_normal([B, F, M],stddev=1.0 ,dtype=tf.float32)) #just for example
A = tf.Variable(tf.truncated_normal([C, B],stddev=1.0) ,dtype=tf.float32) #just for example

# shape=(C,B,1,1)
A_new = tf.expand_dims(tf.expand_dims(A,-1),-1)

U_t = []
for ccc in range(C):
    a = A_new[ccc,:]
    a_broadcasted = tf.reduce_sum(tf.multiply(a, U),axis=0)
    U_t.append(a_broadcasted)
U_tcs = tf.concat(U_t,axis=0)