赞
踩
@创建于: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理解与代码实现 !对原文代码有改动
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。