Tensorflow段添加

时间:2018-01-18 11:31:24

标签: python tensorflow

假设我有一个形状的张量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)

我该如何解决这个问题?有没有更好的方法来进行积累? 感谢。

0 个答案:

没有答案