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

时间:2018-12-31 19:03:48

标签: python-2.7 tensorflow matrix matrix-multiplication weighted

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

我有两个张量 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 个答案:

答案 0 :(得分:0)

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)