我正在尝试对张量流进行矩阵求和。 不幸的是,我的尺寸不小,并且记忆有问题。另一种选择是我做的事情完全错误
我有两个张量 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内存)
我正确地执行了加权总和吗?
任何想法如何使其更有效吗?
我将不胜感激。谢谢。
答案 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)