在 GRU 中使用嵌入层
Using embedding layer with GRU
我有一个工作代码使用 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"))
这 returns 给定输入 window 的预测嵌入。现在我想在 GRU 之上使用 keras 嵌入层。我的想法是输入一个二维数组(None, 10),使用embedding层将每个样本转化为对应的embedding vector。
所以现在我有了这个:
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层的输出是:
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 阵列和嵌入层生成的阵列之间有什么区别?
您的模型反映了所需的计算;但是,错误是 Y
您正在传递给模型。您传递的是标量目标,而不是大小为 (64,)
的数组。澄清一下,您的输入应该是整数序列,但您的目标仍然需要是向量。
另外,Dense
默认是线性激活,所以你不需要Dense(64)
后的Activation('linear')
。
我有一个工作代码使用 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"))
这 returns 给定输入 window 的预测嵌入。现在我想在 GRU 之上使用 keras 嵌入层。我的想法是输入一个二维数组(None, 10),使用embedding层将每个样本转化为对应的embedding vector。
所以现在我有了这个:
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层的输出是:
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 阵列和嵌入层生成的阵列之间有什么区别?
您的模型反映了所需的计算;但是,错误是 Y
您正在传递给模型。您传递的是标量目标,而不是大小为 (64,)
的数组。澄清一下,您的输入应该是整数序列,但您的目标仍然需要是向量。
另外,Dense
默认是线性激活,所以你不需要Dense(64)
后的Activation('linear')
。