嵌入之前的Keras Lambda层:用于将文本转换为整数

时间:2018-10-19 21:12:54

标签: python tensorflow keras

我目前有一个keras模型,该模型使用Embedding层。像这样:

input = tf.keras.layers.Input(shape=(20,) dtype='int32')
x = tf.keras.layers.Embedding(input_dim=1000,
                              output_dim=50,
                              input_length=20,
                              trainable=True,
                              embeddings_initializer='glorot_uniform',
                              mask_zero=False)(input)

这很棒,并且可以正常工作。但是,我希望能够将文本发送到我的模型,让它将文本预处理为整数,然后继续正常运行。

两个问题:

1)Keras文档说嵌入层只能用作模型的第一层:https://keras.io/layers/embeddings/

2)即使我可以在Lambda之前添加Embedding层,我仍需要它来跟踪某些状态(例如将特定单词映射为整数的字典)。我该如何进行这种有状态的预处理?

简而言之,我需要修改基础的Tensorflow DAG,因此,当我保存模型并上传到ML Engine时,它将能够处理向其发送原始文本的情况。

谢谢!

1 个答案:

答案 0 :(得分:1)

这是使用字符串输入的模型的前几层:

input = keras.layers.Input(shape=(1,), dtype="string", name='input_1')
lookup_table_op = tf.contrib.lookup.index_table_from_tensor(
 mapping=vocab_list,
 num_oov_buckets=num_oov_buckets,
 default_value=-1,
)
lambda_output = Lambda(lookup_table_op.lookup)(input)
emb_layer = Embedding(int(number_of_categories),int(number_of_categories**0.25))(lambda_output)

然后,您可以像平常一样在嵌入层之后继续进行模型。这对我有用,并且该模型可以从字符串输入中很好地训练。

建议您在某些预处理步骤中执行字符串-> int转换,以加快训练过程。然后,在对模型进行训练之后,您将创建第二个keras模型,该模型仅将string-> int转换,然后将这两个模型组合以获得完整的string->目标模型。