合并序列嵌入与时间序列特征
Merging sequence embedding with Time Series Features
我在 Keras 实现 LSTM 的某些方面遇到了麻烦。这是我的问题的描述:
我正在尝试训练单词正确性预测模型。我的模型有两种类型的输入:
- 一个词序列(句子)
- 和一系列特征向量(对于每个单词,我计算一个特征胜利者为 6)。
例如
input_1 = ['we', 'have', 'two', 'review']
input_2 = [
[1.25, 0.01, 0.000787, 5.235, 0.0, 0.002091],
[ 0.0787, 0.02342, 5.4595, 0.002091, 0.003477, 0.0],
[0.371533, 0.529893, 0.371533, 0.6, 0.0194156, 0.003297],
[0.471533, 0.635, 0.458, 0.7, 0.0194156, 0.0287]
]
gives output = [1, 1, 2, 1]
由于训练集中的每个句子都有不同的长度,我应该对所有句子进行零填充,使它们的长度都相同。
我的问题是第二个输入怎么样,我应该做填充吗!如何?因为它们是矢量。
模型架构:
input1 = Input(shape=(seq_length,), dtype='int32')
emb = Embedding(input_dim=num_words, output_dim = num_dimension,
input_length=seq_length, weights=[embeddings], mask_zero=True,trainable=False)(input_layer)
input2 = Input(shape=(seq_length,6 ))
x = keras.layers.concatenate([emb, input2],axis=2)
lstm = LSTM(64, return_sequences=True)(x)
ackwards = LSTM(128, return_sequences=True, go_backwards=True)(x)
common = merge([forwards, backwards], mode='concat', concat_axis=-1)
out = TimeDistributed(Dense(no_targets, activation='softmax'))(lstm)
您走在正确的轨道上,是的,您需要用零行填充第二个输入以匹配句子长度。基本上它看起来像这样:
# Input 1
X1 = [[12, 34, 3], [6, 7, 0]] # where numbers are word indices and 0 is padding
# Input 2
X2 = [[[1.23,...,2.4], [1.24, ...], [0.6, ...]], [[3.25, ...], [2.4, ...], [0,0,0,0,0]]]
# So the padded words get zero feature vectors as well and the shapes match
但不要害怕,因为您将 emb
与 input2
连接起来,mask_zero=True
也会传播到连接后的向量,因此 LSTM 实际上也会忽略来自第二个输入的填充。
我在 Keras 实现 LSTM 的某些方面遇到了麻烦。这是我的问题的描述:
我正在尝试训练单词正确性预测模型。我的模型有两种类型的输入:
- 一个词序列(句子)
- 和一系列特征向量(对于每个单词,我计算一个特征胜利者为 6)。
例如
input_1 = ['we', 'have', 'two', 'review']
input_2 = [
[1.25, 0.01, 0.000787, 5.235, 0.0, 0.002091],
[ 0.0787, 0.02342, 5.4595, 0.002091, 0.003477, 0.0],
[0.371533, 0.529893, 0.371533, 0.6, 0.0194156, 0.003297],
[0.471533, 0.635, 0.458, 0.7, 0.0194156, 0.0287]
]
gives output = [1, 1, 2, 1]
由于训练集中的每个句子都有不同的长度,我应该对所有句子进行零填充,使它们的长度都相同。
我的问题是第二个输入怎么样,我应该做填充吗!如何?因为它们是矢量。
模型架构:
input1 = Input(shape=(seq_length,), dtype='int32')
emb = Embedding(input_dim=num_words, output_dim = num_dimension,
input_length=seq_length, weights=[embeddings], mask_zero=True,trainable=False)(input_layer)
input2 = Input(shape=(seq_length,6 ))
x = keras.layers.concatenate([emb, input2],axis=2)
lstm = LSTM(64, return_sequences=True)(x)
ackwards = LSTM(128, return_sequences=True, go_backwards=True)(x)
common = merge([forwards, backwards], mode='concat', concat_axis=-1)
out = TimeDistributed(Dense(no_targets, activation='softmax'))(lstm)
您走在正确的轨道上,是的,您需要用零行填充第二个输入以匹配句子长度。基本上它看起来像这样:
# Input 1
X1 = [[12, 34, 3], [6, 7, 0]] # where numbers are word indices and 0 is padding
# Input 2
X2 = [[[1.23,...,2.4], [1.24, ...], [0.6, ...]], [[3.25, ...], [2.4, ...], [0,0,0,0,0]]]
# So the padded words get zero feature vectors as well and the shapes match
但不要害怕,因为您将 emb
与 input2
连接起来,mask_zero=True
也会传播到连接后的向量,因此 LSTM 实际上也会忽略来自第二个输入的填充。