TensorFlow2中Embedding层的使用

TensorFlow2中Embedding层的使用,第1张

文章目录
    • 1 简介
      • 参数
    • 2 示例一
      • 2.1数据准备
      • 2.2 模型搭建与测试
      • 2.3 查看结果
    • 3 示例二

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中文文档

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/578417.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-11

发表评论

登录后才能评论

评论列表(0条)

保存