作為一個最小的例子,假設我有一個形式的張量:
[[ 1. 0. 3. ]
[ 7. 5. 6. ]
[ 0. 0. 0. ]
[ 0. 11. 1. ]
[ 0. 0. 0. ]
[ 0. 0. 0. ]
[13. 14. 16.5]]
有沒有辦法(原生在 tensorflow 中)來估算完全歸零的行,以便將它們的值分配為等于最后一個非完全歸零的行?即->:
[[ 1. 0. 3. ]
[ 7. 5. 6. ]
[ 7. 5. 6. ]
[ 0. 11. 1. ]
[ 0. 11. 1. ]
[ 0. 11. 1. ]
[13. 14. 16.5]]
我想過使用tf.tensor_scatter_nd_update但沒有成功。
uj5u.com熱心網友回復:
我們可以使用tf.gather(a, indices)得到上面的輸出。
indices需求[0, 1, 1, 3, 3, 3, 6]可以通過以下代碼獲得:
mask = tf.cast(tf.cast(tf.reduce_sum(a, axis=1), dtype=tf.bool), tf.float32)
#[1., 1., 0., 1., 0., 0., 1.] where non-zero sum
mask_range = (mask*tf.range(a.shape[0], dtype=tf.float32))
#[0., 1., 0., 3., 0., 0., 6.] apply mask on range()
indices =tf.cast(tf.scan(lambda a, b: tf.maximum(a, b), mask_range, initializer=tf.reduce_min(mask_range)), tf.int32)
# cumulative max [0, 1, 1, 3, 3, 3, 6]
tf.gather(a, indices)
[[ 1. , 0. , 3. ], [ 7. , 5. , 6. ], [ 7. , 5. , 6. ], [ 0. , 11. , 1. ], [ 0. , 11. , 1. ], [ 0. , 11. , 1. ], [13. , 14. , 16.5]]
uj5u.com熱心網友回復:
此代碼也可以在 GPU 上運行。
data = tf.constant([[ 1., 0., 3. ],
[ 7., 5., 6. ],
[ 0., 0., 0. ],
[ 0., 11., 1. ],
[ 0., 0., 0. ],
[ 0., 0., 0. ],
[13., 14., 16.5]])
rows_length = data.shape[-1]
i = tf.constant(0)
c = lambda i: tf.less(i, len(data))
tf.while_loop(c, find_zeros_and_update, [i])
def find_zeros_and_update(i):
global _data
if(i == 0):
_data = data
if(tf.reduce_sum(_data[i]) == 0):
rows = tf.ones(shape=(rows_length,1), dtype=tf.int32) (i-1)
columns = tf.split(tf.range(0,rows_length),rows_length)
indices = tf.concat((rows , columns), axis=1)
update = _data[i-1]
_data = tf.tensor_scatter_nd_update(_data, indices, update,)
return (tf.add(i,1),)
輸出:
<tf.Tensor: shape=(7, 3), dtype=float32, numpy=
array([[ 1. , 0. , 3. ],
[ 7. , 5. , 6. ],
[ 7. , 5. , 6. ],
[ 0. , 11. , 1. ],
[ 0. , 11. , 1. ],
[ 0. , 11. , 1. ],
[13. , 14. , 16.5]], dtype=float32)>
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/526969.html
標籤:Python张量流喀拉斯
上一篇:如何填充所有張量以適應所有尺寸
