Tensorflow/Keras embedding 嵌入层

是一个可学习层,用于学习单词或者其它以index标记的数据的编码(通常是向量编码)

为何需要这个层?普通的one-hot编码很难表示两个词之间的相关度,但通过可训练的embedding

层可以学习出两个词变量编码,且如果是相关的词,词向量之间具有更大的相关性。

------

Keras:

keras.layers.embeddings.Embedding(input_dim, output_dim,

embeddings_initializer='uniform', embeddings_regularizer=None,

activity_regularizer=None, embeddings_constraint=None, mask_zero=False, input_length=None)

输入shape

形如(samples,sequence_length)的2D张量

输出shape

形如(samples, sequence_length, output_dim)的3D张量

官方例子:

【1】model = Sequential()

【2】model.add(Embedding(input_dim=1000,output_dim=64, input_length=10))

【3】input_array = np.random.randint(1000, size=(32, 10))

【4】model.compile('rmsprop', 'mse')

【5】output_array = model.predict(input_array)

【6】assert output_array.shape == (32, 10, 64)

解释:

【1】【2】创建序列模型并添加embedding层,1000是最长编码长度,输入数据最大下标+1,在【3】中创建的输入数据最大为999,因此此处input_dim为1000

【3】创建输入变量 shape=(32,10) 可以认为32是batch_size,10是数据长度

【4】编译模型

【5】预测输出模型值

【6】输出shape为 (32,10,64),其中(32,10)是原输入数据的shape,64是经过embadding编码向量长度,即使用64长度的编码代表一个原输入数据值

--- --- --- --- --- --- --- ---

tensoflow:

tf.nn.embedding_lookup,参数有两个(tensor, id):tensor就是输入张量,id就是张量对应的索引。

tensor可以是训练参数,也可以是定值,id就是输入变量的index值,例如词的index标记;

使用:

例1:

  1. c = np.random.random([100,10])  
  2. b = tf.nn.embedding_lookup(c, [1, 3])  
  3.   
  4. with tf.Session() as sess:  
  5.     sess.run(tf.initialize_all_variables())  
  6.     print sess.run(b)  
  7.     print c  

解释:c表示编码矩阵,最长100个编码词,每个编码的长度为10;

b的输出为取c编码矩阵中第1个和第三个,每个长度为10

例2:

【1】input_ids = tf.placeholder(dtype=tf.int32, shape=[None])

【2】embedding = tf.Variable(np.identity(5, dtype=np.int32))

【3】input_embedding = tf.nn.embedding_lookup(embedding, input_ids)

【4】sess = tf.InteractiveSession()

【5】sess.run(tf.global_variables_initializer())

【6】print(embedding.eval())

【7】print(sess.run(input_embedding, feed_dict={input_ids:[1, 2, 3, 0, 3, 2, 1]}))

解释:

【1】输入变量占位符,长度不定。【2】embedding的tensor变量,定义编码矩阵,此处为对角阵,矩阵对角上的值为1,其它为0,可以认为是一种one-hot编码。

embedding = [[1 0 0 0 0]

[0 1 0 0 0]

[0 0 1 0 0]

[0 0 0 1 0]

[0 0 0 0 1]]

【3】通过指定input_ids查找编码。

【4】【5】初始化。【6】输出编码矩阵

【7】feed_dict输入变量赋值,根据ins输出【3】op的值,分别是对应index为[1, 2, 3, 0, 3, 2, 1]的编码向量。

---------------------------------

注意:

embedding层其实是可以训练的层,各编码向量可以通过以后的学习得到

猜你喜欢

转载自blog.csdn.net/goddessblessme/article/details/79892613