是一个可学习层,用于学习单词或者其它以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)
形如(samples,sequence_length)的2D张量
形如(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:
解释: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层其实是可以训练的层,各编码向量可以通过以后的学习得到