TensorFlow2中Embedding层的使用(tf.keras.layers.Embedding)
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:大或等于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。
参考文献:、
上一篇:
JS实现多线程数据分片下载
下一篇:
卷积神经网络~简单的卷积网络