私はテンソルフローに長さのテンソルを持っています、それがこのように見えるとしましょう:
[4, 3, 5, 2]
1と0のマスクを作成したいと思います。その数は、このテンソルへのエントリに対応し、0が埋め込まれて全長が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]
]
どうすればこれを行うことができますか?
これは、さまざまな TensorFlow変換 を使用して実現できます。
# 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]))
これは、tf.sequence_mask
によって実現できるようになりました。詳細 ここ 。
以前の回答よりも少し短いバージョンがあります。それがより効率的かどうかわからない
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)