如何在张量流中将加权和作为张量运算?
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)
我正在尝试在张量流中对矩阵进行加权求和。 不幸的是,我的尺寸不小,而且我的记忆力有问题。另一种选择是我做的事情完全错了
我有两个张量 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)