input_dim
,output_dim
和input_length
的含义是:
Embedding(input_dim, output_dim, input_length)
从我理解的文档中:
input_dim
:int> 0.词汇量的大小output_dim
:int> = 0.密集嵌入的维度。input_length
:输入序列的长度因此,当我的输入是google.com
之类的单词时,每个字符由整数[5, 2, 2, 5, 8, 3, 4, 1, 2, 9]
表示,可能的最大字长为75
。可能的最大字符为38
。我应该如何决定input_dim
,output_dim
和input_length
?
答案 0 :(得分:7)
为了使用单词进行自然语言处理或机器学习任务,首先需要将它们映射到连续的向量空间,从而创建单词向量或单词嵌入。 Keras嵌入层对于构造这样的单词向量很有用。
input_dim :词汇量大小。这是您的语料库中表示的唯一单词数。
output_dim :单词向量的所需维度。例如,如果output_dim = 100,那么每个单词将被映射到具有100个元素的向量,而如果output_dim = 300,则每个单词将被映射到具有300个元素的向量上。
input_length :序列的长度。例如,如果您的数据由句子组成,则此变量表示句子中有多少单词。由于不同的句子通常包含不同数量的单词,因此通常需要填充序列以使所有句子具有相同的长度。 keras.preprocessing.pad_sequence方法可以用于此(https://keras.io/preprocessing/sequence/)。
在Keras中,可以1)使用预训练的单词向量,例如GloVe或word2vec表示,或2)学习单词向量作为训练过程的一部分。这篇博客文章(https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html)提供了有关如何使用GloVe预训练单词向量的教程。对于选项2,Keras将随机初始化向量作为默认选项,然后在训练过程中学习最佳单词向量。
答案 1 :(得分:4)
如Explain with example: how embedding layers in keras works所示,您可以将句子转换为整数列表(向量或张量)。带有input_length的向量示例(句子的最大长度为6,如果你的句子是更长的剩余单词被修剪)
'This is a text' --> [0 0 1 2 3 4]
'This is a very long text, my friends' --> [1 2 3 5 6 4]
然后使用keras的嵌入层,您可以将这些向量转换为output_dim深度的嵌入向量。例如output_dim = 3:
[0 0 1 2 3 4] -->
array([[ 0.00251105, 0.00724941, -0.01146401],
[ 0.00251105, 0.00724941, -0.01146401],
[ 0.03071865, 0.00953215, -0.01349484],
[ 0.02962008, 0.04860269, -0.04597988],
[-0.01875228, 0.03349927, -0.03210936],
[-0.02512982, 0.04811014, 0.03172458]], dtype=float32)
最后一个参数input_dim是映射到嵌入向量的词汇表的大小。您可以通过运行
来查看它model.layers[0].get_weights()
因为嵌入层通常是模型的第一层。如果它是10,嵌入层包含10个大小为output_dim的向量。请注意,第一个元素对应于输入向量中的0映射(0 - > [0.00251105,0.00724941,-0.01146401]),等于1的第二个等。
[array([[ 0.00251105, 0.00724941, -0.01146401],
[ 0.03071865, 0.00953215, -0.01349484],
[ 0.02962008, 0.04860269, -0.04597988],
[-0.01875228, 0.03349927, -0.03210936],
[-0.02512982, 0.04811014, 0.03172458],
[-0.00569617, -0.02348857, -0.00098624],
[ 0.01327456, 0.02390958, 0.00754261],
[-0.04041355, 0.03457253, -0.02879228],
[-0.02695872, 0.02807242, 0.03338097],
[-0.02057508, 0.00174383, 0.00792078]], dtype=float32)]
增加input_dim可以映射更大的词汇量,但也可以增加emdebbing层的参数数量。参数数量为input_dim x output_dim。
据我所知,这些向量是随机启动的,并使用优化器算法训练为任何其他层。但是,您可以使用不同的算法,如word2vec或预制的矢量,如手套(https://nlp.stanford.edu/projects/glove/)。想法是每个单词将代表空间中的一个独特位置(由它的向量描述),你可以在单词的语义(含义)上应用一些向量数学。例如。 W('cheesburger') - W('奶酪')= W('汉堡')或W('王子') - W('男人')+ W('女人')= W('公主')查看更多例如在https://www.oreilly.com/learning/capturing-semantic-meanings-using-deep-learning
答案 2 :(得分:2)
通过查看layer的keras
文档,您会看到以下内容:
Embedding(1000, 64, input_length=10)
#the model will take as input an integer matrix of size (batch, input_length).
#the largest integer (i.e. word index) in the input should be no larger than 999 (vocabulary size).
#now model.output_shape == (None, 10, 64), where None is the batch dimension.
通过使用您在帖子中提供的值,您可以尝试掌握此方法的想法,并可以提出以下设置:
input_dim=38
input_length=75
虽然output_dim
是一个模型参数,您仍需要确定(并且可能必须尝试不同的值才能找到最佳值)。
修改:您可以找到有关嵌入图层here的其他信息。
答案 3 :(得分:0)