예제 #1
0
def infer_nmt(encoder_model, decoder_model, test_en_seq, en_vsize, fr_vsize):
    """
    Infer logic
    :param encoder_model: keras.Model
    :param decoder_model: keras.Model
    :param test_en_seq: sequence of word ids
    :param en_vsize: int
    :param fr_vsize: int
    :return:
    """

    test_fr_seq = sents2sequences(fr_tokenizer, ['sos'], fr_vsize)
    test_en_onehot_seq = to_categorical(test_en_seq, num_classes=en_vsize)
    test_fr_onehot_seq = np.expand_dims(to_categorical(test_fr_seq, num_classes=fr_vsize), 1)

    enc_outs, enc_fwd_state, enc_back_state = encoder_model.predict(test_en_onehot_seq)
    dec_state = np.concatenate([enc_fwd_state, enc_back_state], axis=-1)
    attention_weights = []
    fr_text = ''

    for i in range(fr_timesteps):

        dec_out, attention, dec_state = decoder_model.predict(
            [enc_outs, dec_state, test_fr_onehot_seq])
        dec_ind = np.argmax(dec_out, axis=-1)[0, 0]

        if dec_ind == 0:
            break
        test_fr_seq = sents2sequences(fr_tokenizer, [fr_index2word[dec_ind]], fr_vsize)
        test_fr_onehot_seq = np.expand_dims(to_categorical(test_fr_seq, num_classes=fr_vsize), 1)

        attention_weights.append((dec_ind, attention))
        fr_text += fr_index2word[dec_ind] + ' '

    return fr_text, attention_weights
예제 #2
0
def preprocess_data(en_tokenizer, fr_tokenizer, en_text, fr_text, en_timesteps, fr_timesteps):
    """ Preprocessing data and getting a sequence of word indices """

    en_seq = sents2sequences(en_tokenizer, en_text, reverse=False, padding_type='pre', pad_length=en_timesteps)
    fr_seq = sents2sequences(fr_tokenizer, fr_text, pad_length=fr_timesteps)
    logger.info('Vocabulary size (English): {}'.format(np.max(en_seq)+1))
    logger.info('Vocabulary size (French): {}'.format(np.max(fr_seq)+1))
    logger.debug('En text shape: {}'.format(en_seq.shape))
    logger.debug('Fr text shape: {}'.format(fr_seq.shape))

    return en_seq, fr_seq
예제 #3
0
def test_inferring(infer_enc_model, infer_dec_model, plot=False):
    """ Inferring with trained model """
    rand_test_ids = np.random.randint(0, len(ts_en_text), size=10)
    for rid in rand_test_ids:
        test_en = ts_en_text[rid]
        # logger.info('\tRequest: {}'.format(test_en))
        print('Request: {}'.format(test_en))

        test_en_seq = sents2sequences(en_tokenizer, [test_en],
                                      pad_length=en_timesteps)
        test_fr, attn_weights = infer_nmt(encoder_model=infer_enc_model,
                                          decoder_model=infer_dec_model,
                                          test_en_seq=test_en_seq,
                                          en_vsize=en_vsize,
                                          fr_vsize=fr_vsize)
        print(Fore.GREEN + 'Response: {}'.format(test_fr) + Style.RESET_ALL)
        # print()

        if plot:
            """ Attention plotting """
            plot_attention_weights(test_en_seq,
                                   attn_weights,
                                   en_index2word,
                                   fr_index2word,
                                   base_dir=base_dir,
                                   filename='attention_{}.png'.format(rid))
예제 #4
0
def infer_nmt(encoder_model, decoder_model, test_en_seq, en_vsize, fr_vsize):
    """
    Infer logic
    :param encoder_model: keras.Model
    :param decoder_model: keras.Model
    :param test_en_seq: sequence of word ids
    :param en_vsize: int
    :param fr_vsize: int
    :return:
    """

    test_fr_seq = sents2sequences(fr_tokenizer, ['sos'], fr_vsize)
    test_en_onehot_seq = to_categorical(test_en_seq, num_classes=en_vsize)
    test_fr_onehot_seq = np.expand_dims(
        to_categorical(test_fr_seq, num_classes=fr_vsize), 1)

    enc_outs, enc_states = get_state(encoder_model.predict(test_en_onehot_seq),
                                     is_tensors=False)
    dec_state = enc_states
    print('WHAT ARE YOU 0 : ', enc_outs.shape, dec_state.shape)

    enc_outs, fwd, back = encoder_model.predict(test_en_onehot_seq)
    dec_state = np.concatenate([fwd, back], axis=-1)
    print('WHAT ARE YOU 1 : ', enc_outs.shape, dec_state.shape)

    attention_weights = []
    fr_text = []  # list of generated words

    for i in range(fr_timesteps):

        dec_out, attention, dec_state = decoder_model.predict(
            [enc_outs, dec_state, test_fr_onehot_seq])
        dec_ind = np.argmax(dec_out, axis=-1)[0, 0]

        if dec_ind == 0:
            break
        test_fr_seq = sents2sequences(fr_tokenizer, [fr_index2word[dec_ind]],
                                      fr_vsize)
        test_fr_onehot_seq = np.expand_dims(
            to_categorical(test_fr_seq, num_classes=fr_vsize), 1)

        attention_weights.append(
            (dec_ind, attention))  # for further visualization
        if not fr_index2word[dec_ind] == 'eos':
            fr_text.append(fr_index2word[dec_ind])

    return ' '.join(fr_text), attention_weights
예제 #5
0
    """ Save model """
    if not os.path.exists(config.MODELS_DIR):
        os.mkdir(config.MODELS_DIR)
    full_model.save(os.path.join(config.MODELS_DIR, 'nmt_bidirectional.h5'))
    """ Index2word """
    en_index2word = dict(
        zip(en_tokenizer.word_index.values(), en_tokenizer.word_index.keys()))
    fr_index2word = dict(
        zip(fr_tokenizer.word_index.values(), fr_tokenizer.word_index.keys()))
    """ Inferring with trained model """

    np.random.seed(100)
    rand_test_ids = np.random.randint(0, len(ts_en_text), size=10)
    for rid in rand_test_ids:
        test_en = ts_en_text[rid]
        logger.info('\nTranslating: {}'.format(test_en))

        test_en_seq = sents2sequences(en_tokenizer, [test_en],
                                      pad_length=en_timesteps)
        test_fr, attn_weights = infer_nmt(encoder_model=infer_enc_model,
                                          decoder_model=infer_dec_model,
                                          test_en_seq=test_en_seq,
                                          en_vsize=en_vsize,
                                          fr_vsize=fr_vsize)
        logger.info('\tFrench: {}'.format(test_fr))
        """ Attention plotting """
        plot_attention_weights(test_en_seq,
                               attn_weights,
                               en_index2word,
                               fr_index2word,
                               filename='attention_{}.png'.format(rid))