2018 年 12 月 12 日 - 发布者:Laurence Moroney
在许多情况下,数据并非均匀地划分成可以加载到张量中的形状一致的数组。一个典型的例子是训练和处理文本。例如,如果您查看使用 IMDB 数据集的文本分类教程,您会发现数据准备工作中很大一部分是将数据整形为标准化的大小。在这种情况下,每条评论都需要 256 个词长。如果它更长,就会被截断,如果它更短,就会用 0 值填充,直到它达到所需长度。
speech = tf.ragged.constant(
[['All', 'the', 'world', 'is', 'a', 'stage'],
['And', 'all', 'the', 'men', 'and', 'women', 'merely', 'players'],
['They', 'have', 'their', 'exits', 'and', 'their', 'entrances']])
当打印出来时,我们可以看到它是由一个列表列表创建的,每个列表的长度都是可变的<tf.RaggedTensor [['All', 'the', 'world', 'is', 'a', 'stage'], ['And', 'all', 'the', 'men', 'and', 'women', 'merely', 'players'], ['They', 'have', 'their', 'exits', 'and', 'their', 'entrances']]>
您期望在普通张量中支持的大多数操作也适用于不规则张量,因此,例如,Python 风格的索引用于访问张量的切片,与预期一致>>print(speech[0])
tf.Tensor(['All', 'the', 'world', 'is', 'a', 'stage'], shape=(6,), dtype=string)
tf.ragged
包还定义了许多特定于不规则张量操作。例如,tf.ragged.map_flat_values
操作可用于有效地转换不规则张量中的各个值,同时保持其形状不变> print tf.ragged.map_flat_values(tf.strings.regex_replace,speech, pattern="([aeiouAEIOU])", rewrite=r"{\1}")
您可以在此处了解有关哪些操作受支持的更多信息。import math
import tensorflow as tf
tf.enable_eager_execution()
# Set up the embeddingss
num_buckets = 1024
embedding_size = 16
embedding_table =
tf.Variable(
tf.truncated_normal([num_buckets, embedding_size],
stddev=1.0 / math.sqrt(embedding_size)),
name="embedding_table")
# Input tensor.
queries = tf.ragged.constant([
['Who', 'is', 'Dan', 'Smith']
['Pause'],
['Will', 'it', 'rain', 'later', 'today']])
# Look up embedding for each word. map_flat_values applies an operation to each value in a RaggedTensor.
word_buckets = tf.strings.to_hash_bucket_fast(queries, num_buckets)
word_embeddings = tf.ragged.map_flat_values(
tf.nn.embedding_lookup, embedding_table, word_buckets) # ①
# Add markers to the beginning and end of each sentence.
marker = tf.fill([queries.nrows()), 1], '#')
padded = tf.concat([marker, queries, marker], axis=1) # ②
# Build word bigrams & look up embeddings.
bigrams = tf.string_join(
[padded[:, :-1], padded[:, 1:]], separator='+') # ③
bigram_buckets =
tf.strings.to_hash_bucket_fast(bigrams, num_buckets)
bigram_embeddings = tf.ragged.map_flat_values(
tf.nn.embedding_lookup, embedding_table, bigram_buckets) # ④
# Find the average embedding for each sentence
all_embeddings =
tf.concat([word_embeddings, bigram_embeddings], axis=1) # ⑤
avg_embedding = tf.reduce_mean(all_embeddings, axis=1) # ⑥
print(word_embeddings)
print(bigram_embeddings)
print(all_embeddings)
print(avg_embedding)
下图说明了这一点。请注意,这些数字仅用于说明目的。有关嵌入中的真实值,请查看代码块末尾输出的值。tf.Tensor
更有效,因为没有时间或空间浪费在填充值上;并且比使用tf.SparseTensor
更灵活和方便,因为它们支持各种操作,并为可变长度列表提供正确的语义。tf.ragged
包文档。
2018 年 12 月 12 日 — 发布者:Laurence Moroney
在许多情况下,数据并非均匀地划分成可以加载到张量中的形状一致的数组。一个典型的例子是训练和处理文本。例如,如果您查看使用 IMDB 数据集的文本分类教程,您会发现数据准备工作中很大一部分是将数据整形为标准化的大小。在这种情况下,每条评论都需要 256 个词长。如果它更长,就会被截断,如果它更短,就会用 0 值填充,直到它达到所需长度。