我的输入序列具有以下形状。
shape(1434, 185, 37)
总共有1434个序列,每个序列的长度为185个字符,唯一字符的总数为37。因此,在某种程度上,我们的vocab大小如下。
vocab_size=37
现在,当我按如下所示将我的keras输入定义到嵌入式层时,
user_input = keras.layers.Input(shape=((185,37)), name='Input_1')
user_vec = keras.layers.Flatten()(keras.layers.Embedding(vocab_size, 50, input_length=185, name='Input_1_embed')(user_input))
我收到以下错误消息。
错误:
ValueError: "input_length" is 185, but received input has shape (None, 185, 37)
现在,当我执行以下操作时,我没有收到任何错误,但是我怀疑它是否正确。
user_input = keras.layers.Input(shape=((185, )), name='Input_1')
user_vec = keras.layers.Flatten()(keras.layers.Embedding(vocab_size, 50, input_length=185, name='Input_1_embed')(user_input))
答案 0 :(得分:1)
如注释部分所述,嵌入层将整数值作为输入,而不是一键编码的矢量。这就是为什么您的第二个解决方案有效而第一个解决方案无效的原因。有关更多说明,请参见this answer。
但是,如果序列中的每个时间步都是表示单词索引的整数向量(例如,在每个文档中,您有185个句子,其中每个句子有37个单词),那么您需要使用TimeDistributed
包装器来应用每个时间步的Embedding
层:
user_input = keras.layers.Input(shape=((185,37)), name='Input_1')
emb_layer = keras.layers.Embedding(vocab_size, 50, input_length=37, name='Input_1_embed')
user_vec = keras.layers.TimeDistributed(emb_layer)(user_input)
user_vec
的形状应为(None, 185, 37, 50)
,即在每个序列的每个时间步中每个单词的大小为50的嵌入向量。