嵌入层将正整数(下标)转换为具有固定大小的向量,如[[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参数。
True
的话,模型中后续的层必须都支持masking,否则会抛出异常。如果该值为True,则下标0在字典中不可用,input_dim应设置为|vocabulary| + 1。Flatten
层,然后接Dense
层,则必须指定该参数,否则Dense
层的输出维度无法自动推断。创造一个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]]
"""
我们将数据转换为具有固定大小的向量
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)
原数据:[[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]
# 数据准备
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中文文档