我可以想到两个主要原因tensorflow.contrib.layers.embed_sequence
很有用:
- 当构建具有多个以特征作为输入的门的神经网络模型时,通过使用
tensorflow.contrib.layers.embed_sequence
,您可以在保留深度的同时减少网络中的参数数量。例如,它消除了 LSTM 的每个门执行其自己的特征线性投影的需要。
- 它允许任意输入形状,这有助于实现简单且灵活。
假设我有一个数据集,如下所示:
[("garbage piles in the city","Garbage"),
("city is clogged with vehicles","Traffic")]
我想获取每个元组的第一个元素,它是一个单词序列。这些单词需要以向量形式嵌入。
第一步,应将它们转换为索引或数字。例如,
在这种情况下,词汇表将是:
vocab = [{'garbage':1},
{'piles':2},
{'in':3},
{'the':4},
{'city':5},
{'is':6},
{'clogged':7},
{'with':8},
{'vehicles':9}]
编码后的文本将如下所示:
features = [[1, 2, 3, 4, 5], [5, 6, 7, 8, 9]]
您将此编码文本传递为features
批量调用此函数:
features_embedded = tf.contrib.layers.embed_sequence(
ids=features,
vocab_size=len(vocab),
embed_dim=EMBEDDING_SIZE,
scope='words'
)
现在,使用索引(1 到 5)表示的每个单词都嵌入到大小为EMBEDDING_SIZE
.
如果批量大小为 2(即一批中有 2 个序列)并且EMBEDDING_SIZE
为 10,输出将是形状矩阵(2, 5, 10)
示例输出:
[[[0.1, 0.3, 0.4, 0.2, 0.5, 0.2, 0.2, 0.2, 0.4, 0.1], # garbage
[0.1, 0.3, 0.4, 0.2, 0.5, 0.2, 0.1, 0.2, 0.4, 0.1], # piles
[0.1, 0.3, 0.4, 0.2, 0.5, 0.2, 0.4, 0.2, 0.4, 0.1], # in
[0.1, 0.3, 0.4, 0.2, 0.5, 0.3, 0.1, 0.2, 0.4, 0.1], # the
[0.1, 0.3, 0.4, 0.2, 0.5, 0.2, 0.1, 0.2, 0.4, 0.6]], # city
[sent2]]
sent2
类似地编码(5 x 10 矩阵)。
希望这一点是清楚的。