2015-12-07 3 views
7

у меня есть тензор длин tensorflow, скажем, это выглядит следующим образом:tensorflow создания маски различной длины

Я хотел бы создать маску 1s и 0s, в которых количество 1s соответствуют записям к этому тензору, дополненному 0s на общую длину 8. Т.е. Я хочу создать этот тензор:

[[1,1,1,1,0,0,0,0], 
[1,1,1,0,0,0,0,0], 
[1,1,1,1,1,0,0,0], 
[1,1,0,0,0,0,0,0] 
] 

Как я могу это сделать?

ответ

10

Это может быть достигнуто с помощью различных TensorFlow transformations:

# Make a 4 x 8 matrix where each row contains the length repeated 8 times. 
lengths = [4, 3, 5, 2] 
lengths_transposed = tf.expand_dims(lengths, 1) 

# Make a 4 x 8 matrix where each row contains [0, 1, ..., 7] 
range = tf.range(0, 8, 1) 
range_row = tf.expand_dims(range, 0) 

# Use the logical operations to create a mask 
mask = tf.less(range_row, lengths_transposed) 

# Use the select operation to select between 1 or 0 for each value. 
result = tf.select(mask, tf.ones([4, 8]), tf.zeros([4, 8])) 
+0

Приятно, но не лучше ли просто вводить логические значения 'mask' в int или использовать их напрямую, а не использовать' tf.select' в последней строке? – Styrke

+0

Конечно! Я думаю, что мой прошлый опыт программирования на C означает, что я никогда не ожидаю, что работа с bool-to-int будет работать :), но я считаю, что это хорошо определено в TensorFlow. – mrry

+0

Существует также 'tf.zeros_like (mask)', который создаст нулевой инициализированный тензор формы тензора 'mask'. –

0

У меня есть немного более короткий вариант, чем предыдущий ответ. Не уверен, если он эффективнее или нет.

def mask(self, seq_length, max_seq_length): 
    return tf.map_fn(
     lambda x: tf.pad(tf.ones([x], dtype=tf.int32), [[0, max_seq_length - x]]), 
     seq_length) 
Смежные вопросы