tf.nn.embedding_lookup记录
2018-06-11 本文已影响4人
slade_sal
我觉得这张图就够了,实际上tf.nn.embedding_lookup的作用就是找到要寻找的embedding data中的对应的行下的vector。
tf.nn.embedding_lookup(params, ids, partition_strategy='mod', name=None, validate_indices=True, max_norm=None)
官方文档位置,其中,params是我们给出的,可以通过:
1.tf.get_variable("item_emb_w", [self.item_count, self.embedding_size])
等方式生产服从[0,1]的均匀分布或者标准分布
2.tf.convert_to_tensor
转化我们现有的array
然后,ids是我们要找的params中对应位置。
举个例子:
import numpy as np
import tensorflow as tf
data = np.array([[[2],[1]],[[3],[4]],[[6],[7]]])
data = tf.convert_to_tensor(data)
lk = [[0,1],[1,0],[0,0]]
lookup_data = tf.nn.embedding_lookup(data,lk)
init = tf.global_variables_initializer()
先让我们看下不同数据对应的维度:
In [76]: data.shape
Out[76]: (3, 2, 1)
In [77]: np.array(lk).shape
Out[77]: (3, 2)
In [78]: lookup_data
Out[78]: <tf.Tensor 'embedding_lookup_8:0' shape=(3, 2, 2, 1) dtype=int64>
这个是怎么做到的呢?关键的部分来了,看下图:
lk中的值,在要寻找的embedding数据中下找对应的index下的vector进行拼接。永远是look(lk)部分的维度+embedding(data)部分的除了第一维后的维度拼接。很明显,我们也可以得到,lk里面值是必须要小于等于embedding(data)的最大维度减一的。
以上的结果就是:
In [79]: data
Out[79]:
array([[[2],
[1]],
[[3],
[4]],
[[6],
[7]]])
In [80]: lk
Out[80]: [[0, 1], [1, 0], [0, 0]]
# lk[0]也就是[0,1]对应着下面sess.run(lookup_data)的结果恰好是把data中的[[2],[1]],[[3],[4]]
In [81]: sess.run(lookup_data)
Out[81]:
array([[[[2],
[1]],
[[3],
[4]]],
[[[3],
[4]],
[[2],
[1]]],
[[[2],
[1]],
[[2],
[1]]]])
最后,partition_strategy是用于当len(params) > 1,params的元素分割不能整分的话,则前(max_id + 1) % len(params)多分一个id.
当partition_strategy = 'mod'的时候,13个ids划分为5个分区:[[0, 5, 10], [1, 6, 11], [2, 7, 12], [3, 8], [4, 9]],也就是是按照数据列进行映射,然后再进行look_up操作。
当partition_strategy = 'div'的时候,13个ids划分为5个分区:[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10], [11, 12]],也就是是按照数据先后进行排序标序,然后再进行look_up操作。