@创建于:20210714
@修改于:20210714
Embedding 是一个将离散变量转为连续向量表示的一个方式。在神经网络中,embedding 是非常有用的,因为它不光可以减少离散变量的空间维数,同时还可以有意义的表示该变量。
- 在 embedding 空间中查找最近邻,这可以很好的用于根据用户的兴趣来进行推荐。
- 作为监督性学习任务的输入。
- 用于可视化不同离散变量之间的关系。
one-hot 是无法考虑语义间的相互关系的,但embedding向量的训练是要借助one-hot的。one-hot把每一个单词映射成一个整数,但实际上这个整数就表示了50维向量中 1 所在的索引位置,用整数显示是为了更好理解和表示,而实际在网络中,它的形式可以理解为如下图(下面相当于one-hot向量为5维,输出embedding向量为3维)
左边的神经元为one-hot输入,右边为得到的embedding表示,图中所对应的红线权重就是该单词对应的词向量,这一层神经元只能作为第一层嵌入,没有偏置和激活函数。它也可以被理解为如下的一个矩阵相乘,输出就是该单词的词向量。然后词向量再输入到下一层。这一层总的参数量就是这些权重,也是下面中间的矩阵。
包模块及方法如下,作用是将正整数(索引值)转换为固定尺寸的稠密向量。 例如: [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]
该层只能用作模型中的第一层。ref:Docs » Layers » 嵌入层 Embedding
from tensorflow.keras.layers import Embedding
keras.layers.Embedding(input_dim, output_dim, embeddings_initializer='uniform', embeddings_regularizer=None, activity_regularizer=None, embeddings_constraint=None, mask_zero=False, input_length=None)
参数解释如下
input_dim: int > 0。词汇表大小,词汇表的维度(总共有多少个不相同的词)。 即最大整数 index + 1。
output_dim: int >= 0。词向量的维度(嵌入词空间的维度)。
embeddings_initializer: embeddings 矩阵的初始化方法 (详见 initializers)。
embeddings_regularizer: embeddings matrix 的正则化方法 (详见 regularizer)。
embeddings_constraint: embeddings matrix 的约束函数 (详见 constraints)。
mask_zero: 是否把 0 看作为一个应该被遮蔽的特殊的 "padding" 值。
这对于可变长的 循环神经网络层 十分有用。
如果设定为 True,那么接下来的所有层都必须支持 masking,否则就会抛出异常。
如果 mask_zero 为 True,作为结果,索引 0 就不能被用于词汇表中
(input_dim 应该与 vocabulary + 1 大小相同)。
input_length: 输入序列的长度(输入语句的长度)。
如果你需要连接Flatten 和 Dense 层,则这个参数是必须的
(没有它,dense 层的输出尺寸就无法计算)。
from tensorflow.keras.layers import Dense, Flatten, Input
from tensorflow.keras.layers import Embedding
from tensorflow.keras.models import Model, Sequential
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.preprocessing.text import one_hot
import numpy as np
# define documents
docs = ['Well done!',
'Good work',
'Great effort',
'nice work',
'Excellent!',
'Weak',
'Poor effort!',
'not good',
'poor work',
'Could have done better.']
# define class labels
labels = np.array([1, 1, 1, 1, 1, 0, 0, 0, 0, 0])
# integer encode the documents
vocab_size = 50
# one_hot编码到[1,n],不包括0
encoded_docs = [one_hot(d, vocab_size) for d in docs]
print(encoded_docs)
# pad documents to a max length of 4 words
max_length = 4
padded_docs = pad_sequences(encoded_docs, maxlen=max_length, padding='post')
print(padded_docs)
# define the model
model = Sequential()
# 这一步对应的参数量为50*8
model.add(Embedding(input_dim=vocab_size, output_dim=8, input_length=max_length, input_shape=(4, )))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
# compile the model
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
# summarize the model
print(model.summary())
# fit the model
model.fit(padded_docs, labels, epochs=100, verbose=0)
# evaluate the model
loss, accuracy = model.evaluate(padded_docs, labels, verbose=0)
# loss_test, accuracy_test = model.evaluate(padded_docs, labels, verbose=0)
print('Accuracy: %f' % (accuracy * 100))
# test the model
test_doc = 'good thing'
encoded_test = [one_hot(test_doc, vocab_size)]
padded_test = pad_sequences(encoded_test, maxlen=max_length, padding='post')
print(padded_test)
label_test = model.predict(padded_test)
print(label_test)
输出结果
[[49, 15], [43, 6], [34, 44], [14, 6], [14], [8], [21, 44], [5, 43], [21, 6], [23, 35, 15, 47]]
[[49 15 0 0]
[43 6 0 0]
[34 44 0 0]
[14 6 0 0]
[14 0 0 0]
[ 8 0 0 0]
[21 44 0 0]
[ 5 43 0 0]
[21 6 0 0]
[23 35 15 47]]
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding (Embedding) (None, 4, 8) 400
_________________________________________________________________
flatten (Flatten) (None, 32) 0
_________________________________________________________________
dense (Dense) (None, 1) 33
=================================================================
Total params: 433
Trainable params: 433
Non-trainable params: 0
_________________________________________________________________
None
2021-07-14 13:56:11.459951: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:176] None of the MLIR Optimization Passes are enabled (registered 2)
Accuracy: 89.999998
[[43 5 0 0]]
[[0.61304027]]
Embedding理解与代码实现 !对原文代码有改动