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、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 示例一

创造一个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)
print(data)
"""
[[ 0  1]
 [ 2  3]
 [ 4 10]]
"""

我们将数据转换成固定大小的矢量

[En]

We convert the data into vectors of a fixed size

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

原数据:[[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))

model = tf.keras.Sequential()
model.add(tf.keras.layers.Embedding(1000, 64, input_length=10))

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。

Original: https://blog.csdn.net/AwesomeP/article/details/124084203
Author: 宛如近在咫尺
Title: TensorFlow2中Embedding层的使用(tf.keras.layers.Embedding)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/496927/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球