在GRU中使用嵌入层

时间:2019-01-23 15:12:23

标签: python keras deep-learning keras-layer

我有一个使用GRU的工作代码,将其手动创建为3D数组(None,10,64)。代码是:

model = Sequential()
model.add(GRU(300, return_sequences=False, input_shape=(None, 64)))
model.add(Dropout(0.8)) 
model.add(Dense(64, input_dim=300))       
model.add(Activation("linear"))

这将在给定输入窗口的情况下返回预测的嵌入。现在,我想在GRU上使用keras嵌入层。我的想法是输入一个二维数组(None,10),并使用嵌入层将每个样本转换为相应的嵌入向量。

现在我有了这个:

model = Sequential()
model.add(Embedding(vocab_size, 64, weights=[embedding_matrix], input_length=10, trainable=False))
model.add(GRU(300, return_sequences=False))
model.add(Dropout(0.8)) 
model.add(Dense(64))  
model.add(Activation("linear")) 

从摘要中我看到嵌入层的输出是:

embedding_2 (Embedding)      (None, 10, 64) 

这是我所期望的。但是当我尝试拟合模型时,会出现此错误:

expected activation_2 to have shape (64,) but got array with shape (1,)

如果我评论其他图层并仅保留嵌入和gru,我将得到:

expected gru_5 to have shape (300,) but got array with shape (1,)

所以我的问题是,拟合手动构建的3D数组与生成的嵌入层之间有什么区别?

1 个答案:

答案 0 :(得分:0)

您的模型反映了所需的计算;但是,错误是Y,您正在传递给模型。您正在传递标量目标,而不是大小为(64,)的数组。为了澄清您的输入应该是整数序列,但是您的目标仍然必须是向量。

此外,默认情况下,Dense具有线性激活功能,因此在Activation('linear')之后不需要Dense(64)