tf.keras.layers.Embedding详解

目录

tf.keras.layers.Embedding的作用

tf.keras.layers.Embedding的示例


tf.keras.layers.Embedding的作用

tf.keras.layers.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,

 input_dim代表词汇总量,比如处理一个文本类任务时,数据中有10000个不同的词汇,那么input_dim就是10000

output_dim代表单个词转换成的向量长度,比如output_dim设置成16,那么就会用16个数字表示一个词

embeddings_initializer代表embedding矩阵的初始化方法,可以查看tf.keras.initializers

embeddings_regularizer代表embedding矩阵的正则化函数,可以查看tf.keras.regularizers

embeddings_constraint代表对embedding矩阵的约束,可以查看tf.keras.constraints

mask_zero可以控制是否去除padding。任务中为了让文本数据一样长,对短的文本会补充一些padding,这些的值一般设置为0。当mask_zero为True时,表示去除这个padding的影响,这时input_dim要设置成词汇总量+1。

input_length输入句子的长度,当这一层后面之间连Flatten或者Dense层时,必须指定这个长度。

使用tf.keras.layers.Embedding时,输入(batch_size, input_length)数据,输出会增加1维,变成(batch_size, input_length, output_dim)

tf.keras.layers.Embedding的示例

import tensorflow as tf

# 加载影评数据集
(x_train,y_train),(x_test,y_test) = tf.keras.datasets.imdb.load_data(num_words=10000)
x_train.shape
# (25000,),长度不固定

# 每个样本都预处理成256个词的长度,如果长度大于256则后面的进行截断,不足的在后面补充0
x_train = tf.keras.preprocessing.sequence.pad_sequences(
    x_train,
    value = 0,
    padding = 'post',
    maxlen = 256
)
x_test = tf.keras.preprocessing.sequence.pad_sequences(
    x_test,
    value = 0, # padding value
    padding = 'post',
    maxlen = 256
)
x_train.shape
# (25000, 256),长度固定为256

# 建立模型,注意tf.keras.layers.Embedding的使用
model = tf.keras.Sequential(
    [
        tf.keras.layers.Embedding(10000, 16, input_length=256, name='embedding'),
        tf.keras.layers.Flatten(name='flatten_1'),
        tf.keras.layers.Dense(units=16, activation='relu', name='dense_1'),
        tf.keras.layers.Dense(units=1, activation='sigmoid', name='prob')
    ]
)
# 配置训练参数
model.compile(
    optimizer = tf.keras.optimizers.Adam(),
    loss = tf.keras.losses.BinaryCrossentropy(),
    metrics = [tf.keras.metrics.BinaryAccuracy()]
)
# 训练模型
history = model.fit(
    x_train,
    y_train,
    batch_size = 512,
    epochs = 50,
    validation_split = 0.5
)
'''
训练log截取了部分
Epoch 1/50
25/25 [==============================] - 1s 23ms/step - loss: 0.6928 - binary_accuracy: 0.5125 - val_loss: 0.6907 - val_binary_accuracy: 0.5533
Epoch 2/50
25/25 [==============================] - 0s 16ms/step - loss: 0.6684 - binary_accuracy: 0.6884 - val_loss: 0.6478 - val_binary_accuracy: 0.6832
'''

# 测试模型
model.evaluate(x_test,y_test,return_dict=True)
# {'loss': 0.5465382933616638, 'binary_accuracy': 0.8533999919891357}
# 测试数据上acc~0.85

 

你可能感兴趣的:(tensorflow2使用,keras,深度学习,人工智能)