繁体   English   中英

如何将张量重塑为LSTM?

[英]How to reshape tensor flattened to a LSTM?

在这里我在Keras编码方面遇到了一些问题。 我需要使用两种类型的嵌入处理两个顺序输入,一个是字嵌入,另一个是doc2vec嵌入,两个都是dim=300 然后我将这两个向量连接成一个更长的向量,因为我想从它们获得一些堆叠的特征。 然而,这两个嵌入可能在不同的空间,所以我必须使用nn.flatten()将这两个向量映射到同一个向量。 然后我需要将输出矢量从flatten馈送到LSTM模型。 但编译器抱怨Input 0 is incompatible with lstm_1: expected ndim=3, found ndim=2 ,我从未设置ndim=3 ,我不知道如何将矢量重新ndim=3为具有正确形状的新输入。 请帮忙解决这个问题。

n_hidden = 50

batch_size = 64

def classification_softmax(left, right):
''' Helper function for the similarity estimate of the LSTMs outputs'''
return K.abs(left - right)
embedding_layer = Embedding(len(embeddings), 300, weights=[embeddings], input_length=max_seq_length,
                            trainable=False)


embedding_cfg_layer =  Embedding(len(cfg_embedding_matrix), 300, weights=[cfg_embedding_matrix], input_length=1,
                            trainable=False)


#cfg_embedding_l=krs.layers.Flatten()(embedding_cfg_layer(cfg_left_input))
#cfg_embedding_r=krs.layers.Flatten()(embedding_cfg_layer(cfg_right_input))
#encoded_left = krs.layers.Concatenate(axis=1)([krs.layers.Flatten()(embedding_layer(left_input)),cfg_embedding_l])
#encoded_right = krs.layers.Concatenate(axis=1)([krs.layers.Flatten()(embedding_layer(right_input)), cfg_embedding_r])

encoded_left = encoded_left
encoded_right = encoded_right
# Since this is a siamese network, both sides share the same LSTM
shared_lstm = LSTM(n_hidden,return_sequences=True)

#encoded_left=krs.layers.Reshape((2,))(encoded_left)
#encoded_right=krs.layers.Reshape((2,))(encoded_right)
left_output = shared_lstm(encoded_left)
right_output = shared_lstm(encoded_right)
    cfg_embedding_l=embedding_cfg_layer(cfg_left_input)
cfg_embedding_r=embedding_cfg_layer(cfg_right_input)
encoded_left = krs.layers.Concatenate(axis=0)([(embedding_layer(left_input),cfg_embedding_l])
encoded_right = krs.layers.Concatenate(axis=0)(embedding_layer(right_input), cfg_embedding_r])
...   
dist = Lambda(lambda x: classification_softmax(x[0], x[1]))([left_output, right_output])
classify = Dense(5, activation=softMaxAxis1)(dist)
# Pack it all up into a model
malstm = Model([left_input, right_input,cfg_left_input,cfg_right_input], [classify])

optimizer = Adadelta(clipnorm=gradient_clipping_norm)

# malstm.compile(loss='mean_squared_error', optimizer='adam', metrics= 
['accuracy', f1, recall,precision])
malstm.compile(loss='categorical_crossentropy', optimizer='adam', metrics= 
[categorical_accuracy])#, f1, recall, precision])

# Start training
training_start_time = time()

malstm_trained = malstm.fit(
[X_train['left'], X_train['right'], X_train['cfg_A'], X_train['cfg_B']],
krs.utils.to_categorical(Y_train, 5),
batch_size=batch_size, nb_epoch=n_epoch,
#callbacks=[metrics],
validation_data=(
    [X_validation['left'], X_validation['right'], 
X_validation['cfg_A'],X_validation['cfg_B']],
    krs.utils.to_categorical(Y_validation, 5)))

我无法从示例代码中分辨出输入的确切形状,因此我无法给出具有确切形状的答案,但在这种情况下,您应该使用Reshape图层。

我将进行你的形状的逻辑跳跃(batch_size, 300 * max_seq_length + 300) ,因为第一个Embedding层输出一个(max_seq_length, 300)张量,第二个输出一个(1, 300) (max_seq_length, 300)张量,然后你扁平化并连接起来。

您想要将2D (batch_size, 300 * max_seq_length + 300)重新整形为3D形状(batch_size, 300 * max_seq_length + 300, 1) 添加具有目标形状的Reshape图层:

reshape = keras.layers.Reshape(300 * max_seq_length + 300, 1)

encoded_left = reshape(encoded_left)
encoded_right = reshape(encoded_right)

然后将它们传递给你的LSTM。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM