假设我有一个形状的张量C(T,78,S)。沿轴1的78个浮标代表具有形状(T,34,S)的34个支付P的组。 T> = 1,S> = 1。
确切的分组及其起始索引是已知的,例如
group = array([3, 2, 3, 2, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 3, 2, 3, 2], dtype=int64)
cash_index = array([ 0, 3, 5, 8, 10, 12, 14, 16, 18, 21, 23, 26, 28, 31, 33, 35, 37, 39, 41, 43, 45, 48, 50, 53, 55, 58, 60, 62, 64, 66, 68, 71, 73, 76], dtype=int64)
使用这种分组,可以比较容易地找出如何使用tf.segment_sum对这些付款进行求和,即
cash_group = array([ 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7,
7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 14,
14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 20, 21, 21, 22,
22, 22, 23, 23, 24, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29,
30, 30, 30, 31, 31, 32, 32, 32, 33, 33], dtype=int64)
但由于tf.segment_sum仅适用于第一个轴,我必须首先转置C,取seg_sum,然后将其转置回来。有更快的方法吗?对于segment_sum,axis =参数确实会有所帮助。
另外,我们要说我需要累积每次付款的价值。
total = tf.zeros_like(P, dtype=tf.float32)
min_group = group.min()
for i in range(min_group):
offst = cash_index+i
int_i = tf.gather(C,offst,axis=1)
total += (total+Nominal[offst])*int_i
这里Nominal只是一个大小为78的简单numpy数组。当所有组的大小相同(例如2)时,这种方法非常有效。但是给出的例子将会出错。为了解决这个问题,我尝试了以下方法:
offst = min_group+cash_index[group>min_group]
dest = np.arange(cash_index.size)[group>min_group]
int_i = tf.gather(C,offst,axis=1)
total = tf.scatter_add(total, dest, (tf.gather(total,dest,axis=1)+Nominal[offst])*int_i)
哪个失败
TypeError: 'ScatterAdd' Op requires that input 'ref' be a mutable tensor (e.g.: a tf.Variable)
我该如何解决这个问题?有没有更好的方法来进行积累? 感谢。