广播和连接参差不齐的张量
Broadcast and concatenate ragged tensors
我有一个参差不齐的张量 [BATCH_SIZE, TIME_STEPS, EMBEDDING_DIM]
。我想用来自另一个形状 [BATCH_SIZE, AUG_DIM]
的张量的数据来扩充最后一个轴。给定示例的每个时间步都会增加相同的值。
如果张量没有因每个示例的 TIME_STEPS
而变得参差不齐,我可以简单地用 tf.repeat
重塑第二个张量,然后使用 tf.concat
:
import tensorflow as tf
# create data
# shape: [BATCH_SIZE, TIME_STEPS, EMBEDDING_DIM]
emb = tf.constant([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [0, 0, 0]]])
# shape: [BATCH_SIZE, 1, AUG_DIM]
aug = tf.constant([[[8]], [[9]]])
# concat
aug = tf.repeat(aug, emb.shape[1], axis=1)
emb_aug = tf.concat([emb, aug], axis=-1)
当 emb
参差不齐时,这不会起作用,因为 emb.shape[1]
未知并且因示例而异:
# rag and remove padding
emb = tf.RaggedTensor.from_tensor(emb, padding=(0, 0, 0))
# reshape for augmentation - this doesn't work
aug = tf.repeat(aug, emb.shape[1], axis=1)
ValueError: Attempt to convert a value (None) with an unsupported type (<class 'NoneType'>) to a Tensor.
目标是创建一个参差不齐的张量 emb_aug
,如下所示:
<tf.RaggedTensor [[[1, 2, 3, 8], [4, 5, 6, 8]], [[1, 2, 3 ,9]]]>
有什么想法吗?
最简单的方法是通过使用参差不齐的张量中每个批次的 tf.RaggedTensor.to_tensor()
and then do the rest of your solution. I'll assume that you need the tensor to remain ragged. The key is to find the row_lengths
使参差不齐的张量成为常规张量,然后使用此信息使增广张量参差不齐。
例子:
import tensorflow as tf
# data
emb = tf.constant([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [0, 0, 0]]])
aug = tf.constant([[[8]], [[9]]])
# make embeddings ragged for testing
emb_r = tf.RaggedTensor.from_tensor(emb, padding=(0, 0, 0))
print(emb_r.shape)
# (2, None, 3)
这里我们将使用 row_lengths
和 sequence_mask
的组合来创建一个新的参差不齐的张量。
# find the row lengths of the embeddings
rl = emb_r.row_lengths()
print(rl)
# tf.Tensor([2 1], shape=(2,), dtype=int64)
# find the biggest row length
max_rl = tf.math.reduce_max(rl)
print(max_rl)
# tf.Tensor(2, shape=(), dtype=int64)
# repeat the augmented data `max_rl` number of times
aug_t = tf.repeat(aug, repeats=max_rl, axis=1)
print(aug_t)
# tf.Tensor(
# [[[8]
# [8]]
#
# [[9]
# [9]]], shape=(2, 2, 1), dtype=int32)
# create a mask
msk = tf.sequence_mask(rl)
print(msk)
# tf.Tensor(
# [[ True True]
# [ True False]], shape=(2, 2), dtype=bool)
从这里我们可以使用tf.ragged.boolean_mask
使增强数据参差不齐
# make the augmented data a ragged tensor
aug_r = tf.ragged.boolean_mask(aug_t, msk)
print(aug_r)
# <tf.RaggedTensor [[[8], [8]], [[9]]]>
# concatenate!
output = tf.concat([emb_r, aug_r], 2)
print(output)
# <tf.RaggedTensor [[[1, 2, 3, 8], [4, 5, 6, 8]], [[1, 2, 3, 9]]]>
您可以找到支持不规则张量的张量流方法列表here
不规则张量可以直接从行长度构造。
输入的值是一个平坦的(相对于未来参差不齐的维度而不是所有其他维度)张量,可以使用 tf.repeat 构造,再次使用 row_lengths 来找到每个样本的适当重复次数!
ragged_lengths = emb.row_lengths()
aug = tf.RaggedTensor.from_row_lengths(
values=tf.repeat(aug, ragged_lengths, axis=0),
row_lengths=ragged_lengths)
emb_aug = tf.concat([emb, aug], axis=-1)
我有一个参差不齐的张量 [BATCH_SIZE, TIME_STEPS, EMBEDDING_DIM]
。我想用来自另一个形状 [BATCH_SIZE, AUG_DIM]
的张量的数据来扩充最后一个轴。给定示例的每个时间步都会增加相同的值。
如果张量没有因每个示例的 TIME_STEPS
而变得参差不齐,我可以简单地用 tf.repeat
重塑第二个张量,然后使用 tf.concat
:
import tensorflow as tf
# create data
# shape: [BATCH_SIZE, TIME_STEPS, EMBEDDING_DIM]
emb = tf.constant([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [0, 0, 0]]])
# shape: [BATCH_SIZE, 1, AUG_DIM]
aug = tf.constant([[[8]], [[9]]])
# concat
aug = tf.repeat(aug, emb.shape[1], axis=1)
emb_aug = tf.concat([emb, aug], axis=-1)
当 emb
参差不齐时,这不会起作用,因为 emb.shape[1]
未知并且因示例而异:
# rag and remove padding
emb = tf.RaggedTensor.from_tensor(emb, padding=(0, 0, 0))
# reshape for augmentation - this doesn't work
aug = tf.repeat(aug, emb.shape[1], axis=1)
ValueError: Attempt to convert a value (None) with an unsupported type (<class 'NoneType'>) to a Tensor.
目标是创建一个参差不齐的张量 emb_aug
,如下所示:
<tf.RaggedTensor [[[1, 2, 3, 8], [4, 5, 6, 8]], [[1, 2, 3 ,9]]]>
有什么想法吗?
最简单的方法是通过使用参差不齐的张量中每个批次的 tf.RaggedTensor.to_tensor()
and then do the rest of your solution. I'll assume that you need the tensor to remain ragged. The key is to find the row_lengths
使参差不齐的张量成为常规张量,然后使用此信息使增广张量参差不齐。
例子:
import tensorflow as tf
# data
emb = tf.constant([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [0, 0, 0]]])
aug = tf.constant([[[8]], [[9]]])
# make embeddings ragged for testing
emb_r = tf.RaggedTensor.from_tensor(emb, padding=(0, 0, 0))
print(emb_r.shape)
# (2, None, 3)
这里我们将使用 row_lengths
和 sequence_mask
的组合来创建一个新的参差不齐的张量。
# find the row lengths of the embeddings
rl = emb_r.row_lengths()
print(rl)
# tf.Tensor([2 1], shape=(2,), dtype=int64)
# find the biggest row length
max_rl = tf.math.reduce_max(rl)
print(max_rl)
# tf.Tensor(2, shape=(), dtype=int64)
# repeat the augmented data `max_rl` number of times
aug_t = tf.repeat(aug, repeats=max_rl, axis=1)
print(aug_t)
# tf.Tensor(
# [[[8]
# [8]]
#
# [[9]
# [9]]], shape=(2, 2, 1), dtype=int32)
# create a mask
msk = tf.sequence_mask(rl)
print(msk)
# tf.Tensor(
# [[ True True]
# [ True False]], shape=(2, 2), dtype=bool)
从这里我们可以使用tf.ragged.boolean_mask
使增强数据参差不齐
# make the augmented data a ragged tensor
aug_r = tf.ragged.boolean_mask(aug_t, msk)
print(aug_r)
# <tf.RaggedTensor [[[8], [8]], [[9]]]>
# concatenate!
output = tf.concat([emb_r, aug_r], 2)
print(output)
# <tf.RaggedTensor [[[1, 2, 3, 8], [4, 5, 6, 8]], [[1, 2, 3, 9]]]>
您可以找到支持不规则张量的张量流方法列表here
不规则张量可以直接从行长度构造。 输入的值是一个平坦的(相对于未来参差不齐的维度而不是所有其他维度)张量,可以使用 tf.repeat 构造,再次使用 row_lengths 来找到每个样本的适当重复次数!
ragged_lengths = emb.row_lengths()
aug = tf.RaggedTensor.from_row_lengths(
values=tf.repeat(aug, ragged_lengths, axis=0),
row_lengths=ragged_lengths)
emb_aug = tf.concat([emb, aug], axis=-1)