1 简介
嵌入层将正整数(下标)转换为具有固定大小的向量,如[[4],[20]]->[[0.25,0.1],[0.6,-0.2]]
Embedding层只能作为模型的第一层
tf.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,
**kwargs
)
参数
重点关注三个input_dim、output_dim、input_length参数。
- input_dim:大或等于0的整数,字典长度,即输入数据最大下标+1
- output_dim:大于0的整数,代表全连接嵌入的维度
- embeddings_initializer: 嵌入矩阵的初始化方法,为预定义初始化方法名的字符串,或用于初始化权重的初始化器。
- embeddings_regularizer: 嵌入矩阵的正则项,为Regularizer对象
- embeddings_constraint: 嵌入矩阵的约束项,为Constraints对象
- mask_zero:布尔值,确定是否将输入中的‘0’看作是应该被忽略的‘填充’(padding)值,该参数在使用递归层处理变长输入时有用。设置为
True
的话,模型中后续的层必须都支持masking,否则会抛出异常。如果该值为True,则下标0在字典中不可用,input_dim应设置为|vocabulary| + 1。 - input_length:当输入序列的长度固定时,该值为其长度。如果要在该层后接
Flatten
层,然后接Dense
层,则必须指定该参数,否则Dense
层的输出维度无法自动推断。
2 示例一
2.1数据准备
创造一个shape为(3,2)的数据,即一共3个数据,每个数据为2维,数据中最大数字为10
import numpy as np
import tensorflow as tf
data = np.array([[0,1],[2,3],[4,10]])
print(data.shape) # (3, 2)
print(data)
"""
[[ 0 1]
[ 2 3]
[ 4 10]]
"""
2.2 模型搭建与测试
我们将数据转换为具有固定大小的向量
model_test = tf.keras.models.Sequential()
model_test.add(tf.keras.layers.Embedding(11,2,input_length=2))
model_test.compile('rmsprop', 'mse')
pre = model_test.predict(data)
print(pre)
print(pre.shape)
其中Embedding(11,2,input_length=2)
- 第一个参数:因输入数据中最大数据为10,因此input_dim设置为11,该参数为必填,“input_dim=”省略
- 第二个参数:2,即将每个数字转换为具有固定大小维度为2的向量,该参数为必填,“output_dim=”省略
- 第三个参数:input_length=2,代表输入的每个数据的长度,因原数据中每个数据为2维,因此input_length=2
2.3 查看结果
原数据:[[0,1],[2,3],[4,10]] shape为(3, 2)
经过模型之后:
array([[[-0.02706119, -0.03584576],
[-0.0184832 , 0.01159693]],
[[-0.03302763, 0.04805403],
[-0.04142798, -0.01162308]],
[[-0.02347708, 0.0004672 ],
[-0.01176012, -0.04759126]]], dtype=float32)
shape为(3, 2, 2)
可以看出原数据中的0变为[-0.02706119, -0.03584576],1变为[-0.0184832 , 0.01159693]
3 示例二
# 数据准备
input_array = np.random.randint(1000, size=(32, 10)) # shape为(32,10)
# 构建测试模型
model = tf.keras.Sequential()
model.add(tf.keras.layers.Embedding(1000, 64, input_length=10))
# 模型的输入size应该为(batch,input_length),并且数据中最大不可超过999
# 模型的输出shape为(None,10,64),‘None’是batch维度
model.compile('rmsprop', 'mse')
output_array = model.predict(input_array)
print(output_array.shape)
输出shape
(32, 10, 64)
分析:
经过Embedding层之后,原数据中的0-999这1000个数,都被映射为一个具有64维的向量。维度由2维变为3维。
注意:原数据为32个10维的整数数据,每个数据的范围为[0,1000) ,正是因为原数据不包含1000,因此Embedding的第一个参数可以设置为1000,如果包含,则需设置为1001。
参考文献:TensorFlow官方文档、Keras中文文档