在Keras模型中重塑编码器解码器

时间:2019-01-20 13:13:34

标签: python keras

我有一个简单的机器翻译模型,可以将英语句子转换为法语句子。我想首先通过英语句子维度传递模型编码器。经解码器翻译后,模型输出为法语句子维。这里的问题是填充后的英语句子和法语句子的长度不同。如何在编码器和解码器之间进行重塑?

这是我的代码:

.css

生成的模型参数如下:

def encdec_model(input_shape, output_sequence_length, english_vocab_size, french_vocab_size):

    learning_rate = 1e-3

    input_seq = Input(input_shape[1:])
    encoder = GRU(64, return_sequences=True)(input_seq)
    decoder = GRU(64, return_sequences=True)(encoder)
    logits = TimeDistributed(Dense(french_vocab_size))(decoder)
    model = Model(input_seq, Activation('softmax')(logits))

    model.compile(loss=sparse_categorical_crossentropy,
                optimizer=Adam(learning_rate),
                metrics=['accuracy'])    

return model

对于输入尺寸为Layer (type) Output Shape Param # _________________________________________________________________ input_13 (InputLayer) (None, 15, 1) 0 _________________________________________________________________ gru_16 (GRU) (None, 15, 64) 12672 _________________________________________________________________ gru_17 (GRU) (None, 15, 64) 24768 _________________________________________________________________ time_distributed_10 (TimeDis (None, 15, 344) 22360 _________________________________________________________________ activation_10 (Activation) (None, 15, 344) 0 _________________________________________________________________ ,我想将输出尺寸更改为(15,1)

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

  

我认为将input_seq传递给编码器意味着完整的句子。

您正在传递完整的句子,GRU一次将接收一个单词,而roll-out则是序列中单词的数量。

让我们举个例子,您的输入是一个类似This is awesome platform, to share knowledge.的句子,其在Hindi语言中的翻译是यह ज्ञान साझा करने के लिए बहुत बढ़िया मंच है।。现在,此处last中的Hindi词对应于2nd中的english词,而last中的english词对应于{ 2nd中的{1}}字(以某种方式),等等。

我的意思是,当您向english发送一个input字时,将有一些与之相对应的功能,这些功能将转到encoder,其中包含有关所有以前的话。现在,它的输出将仅取决于它所看到的那些单词。

如果当前步骤之前序列中的任何单词有错误,则很明显,(解码器的)完整句子将是错误的,它没有看到完整的句子。

一个选项是对完整序列进行编码以压缩信息,然后允许decoderdecoder中的信息进行解码。 Here是使用此方法的很好解释的示例。

相关问题