Generování překladů
Teď si vyzkoušíš generování francouzských překladů pomocí inferenčního modelu natrénovaného s využitím Teacher Forcing.
Tento model (nmt_tf) byl trénován po dobu 50 epoch na 100 000 větách a dosáhl přibližně 98% přesnosti na validační sadě čítající více než 35 000 příkladů. Inicializace tohoto cvičení může trvat déle, protože je potřeba načíst natrénovaný model. K dispozici máš funkci sents2seqs(). Byly ti také poskytnuty dvě nové funkce:
word2onehot(tokenizer, word, vocab_size), která přijímá:
- tokenizer – objekt
Tokenizerz Kerasu - word – řetězec představující slovo ze slovníku (např.
'apple') - vocab_size – velikost slovníku
probs2word(probs, tok), která přijímá:
- probs – výstup modelu ve tvaru
[1,<French Vocab Size>] - tok – objekt
Tokenizerz Kerasu
Zdrojový kód těchto funkcí si můžeš prohlédnout zadáním print(inspect.getsource(word2onehot)) a print(inspect.getsource(probs2word)) do konzole.
Toto cvičení je součástí kurzu
Machine Translation with Keras
Pokyny k cvičení
- Předpověz počáteční stav dekodéru (
de_s_t) pomocí enkodéru. - Předpověz výstup a nový stav dekodéru na základě předchozí předpovědi (výstupu) a předchozího stavu jako vstupů. Nezapomeň nový stav generovat rekurzivně.
- Získej řetězec slova z pravděpodobnostního výstupu pomocí funkce
probs2word(). - Převeď řetězec slova na sekvenci one-hot kódování pomocí funkce
word2onehot().
Interaktivní cvičení na vyzkoušení si v praxi
Vyzkoušejte si toto cvičení dokončením tohoto ukázkového kódu.
en_sent = ['the united states is sometimes chilly during december , but it is sometimes freezing in june .']
print('English: {}'.format(en_sent))
en_seq = sents2seqs('source', en_sent, onehot=True, reverse=True)
# Predict the initial decoder state with the encoder
de_s_t = ____.predict(____)
de_seq = word2onehot(fr_tok, 'sos', fr_vocab)
fr_sent = ''
for i in range(fr_len):
# Predict from the decoder and recursively assign the new state to de_s_t
de_prob, ____ = ____.predict([____,____])
# Get the word from the probability output using probs2word
de_w = probs2word(____, fr_tok)
# Convert the word to a onehot sequence using word2onehot
de_seq = word2onehot(fr_tok, ____, fr_vocab)
if de_w == 'eos': break
fr_sent += de_w + ' '
print("French (Ours): {}".format(fr_sent))
print("French (Google Translate): les etats-unis sont parfois froids en décembre, mais parfois gelés en juin")