我目前有一个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时,它将能够处理向其发送原始文本的情况。
谢谢!
答案 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->目标模型。