从模型生成翻译

使用 Keras 的机器翻译

Thushan Ganegedara

Data Scientist and Author

旧模型 vs 新模型

编码器-解码器 重复向量

编码器-解码器 哪个输入

使用 Keras 的机器翻译

训练完成的模型

教师强制 训练后的模型

使用 Keras 的机器翻译

推理模型的解码器

  • 输入

    • 单词的 one-hot 向量
    • 状态输入(来自上一个时间步)
  • 输出

    • 新的状态
    • 预测(即一个词)
  • 递归地将预测词和状态反馈为输入

使用 Keras 的机器翻译

完整的推理模型

  • 带递归解码器的推理模型

编码器 递归解码器

  • 上一章的推理模型 编码器 解码器 之前
使用 Keras 的机器翻译

sos 与 eos 令牌的作用

  • sos 标记翻译的开始(如法语句子)。

    • sos 作为解码器的首词输入并持续预测
  • eos 标记翻译的结束。

    • 当模型预测到 eos 时停止
  • 作为安全措施,设置模型可预测的最大长度

使用 Keras 的机器翻译

定义生成器的编码器

  • 导入层和 Model

    # Import Keras layers
    import tensorflow.keras.layers as layers
    from tensorflow.keras.models import Model
    
  • 定义模型层

    en_inputs = layers.Input(shape=(en_len,en_vocab))
    en_gru = layers.GRU(hsize, return_state=True)
    en_out, en_state = en_gru(en_inputs)
    
  • 定义 Model 对象

    encoder = Model(inputs=en_inputs, outputs=en_state)
    
使用 Keras 的机器翻译

定义生成器的解码器

  • 定义解码器的 Input
de_inputs = layers.Input(shape=(1, fr_vocab))
de_state_in = layers.Input(shape=(hsize,))
  • 定义解码器的中间 layers
de_gru = layers.GRU(hsize, return_state=True)
de_out, de_state_out = de_gru(de_inputs, initial_state=de_state_in)

de_dense = layers.Dense(fr_vocab, activation='softmax') de_pred = de_dense(de_out)
  • 定义解码器 Model
decoder = Model(inputs=[de_inputs, de_state_in], outputs=[de_pred, de_state_out])
使用 Keras 的机器翻译

拷贝权重

  • 获取层 l1 的权重
    • w = l1.get_weights()
  • w 设置层 l2 的权重
    • l2.set_weights(w)
  • 在我们的模型中,有三层带权重
    • 编码器 GRU、解码器 GRU 和解码器 Dense
en_gru_w = tr_en_gru.get_weights()
en_gru.set_weights(en_gru_w)

也可写为:

en_gru.set_weights(tr_en_gru.get_weights())
使用 Keras 的机器翻译

生成翻译

en_sent = ['the united states is sometimes chilly during 
           december , but it is sometimes freezing in june .']
  • 将英文句子转为序列
en_seq = sents2seqs('source', en_st, onehot=True, reverse=True)
  • 获取上下文向量
de_s_t = encoder.predict(en_seq)
  • 将"sos"(解码器的初始词)转为序列
de_seq = word2onehot(fr_tok, 'sos', fr_vocab)
使用 Keras 的机器翻译

生成翻译

fr_sent = ''

for _ in range(fr_len): de_prob, de_s_t = decoder.predict([de_seq,de_s_t])
de_w = probs2word(de_prob, fr_tok)
de_seq = word2onehot(fr_tok, de_w, fr_vocab)
if de_w == 'eos': break fr_sent += de_w + ' '
使用 Keras 的机器翻译

开始翻译!

使用 Keras 的机器翻译

Preparing Video For Download...