def test_get_same(self):
     model = get_model(
         token_num=13,
         embed_dim=30,
         encoder_num=3,
         decoder_num=2,
         head_num=3,
         hidden_dim=120,
         attention_activation=None,
         feed_forward_activation='relu',
         dropout_rate=0.05,
         use_same_embed=True,
         embed_weights=np.random.random((13, 30)),
         trainable=False,
     )
     model.compile(
         optimizer=keras.optimizers.Adam(),
         loss=keras.losses.categorical_crossentropy,
         metrics={},
     )
     model_path = os.path.join(
         tempfile.gettempdir(),
         'test_transformer_%f.h5' % np.random.random())
     model.save(model_path)
     model = keras.models.load_model(model_path,
                                     custom_objects=get_custom_objects())
     model.summary()
     try:
         keras.utils.plot_model(model, 'transformer_same.png')
     except Exception as e:
         print(e)
     self.assertIsNotNone(model)
Beispiel #2
0
def main():
    gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.40)
    session_conf = tf.ConfigProto(allow_soft_placement=True,
                                  log_device_placement=False,
                                  gpu_options=gpu_options)
    sess = tf.Session(config=session_conf)

    if (m != "Transformer"):
        if (i == 0):
            model = main_step(del_classList[i], del_classList[i + 1], True,
                              None)
            model.save("./generated_models/temp_saves/model.h5")
        else:
            model = load_model("./generated_models/temp_saves/model.h5")
            model = main_step(del_classList[i], del_classList[i + 1], False,
                              model)
            model.save("./generated_models/temp_saves/model.h5")
    elif (m == "Transformer"):
        if (i == 0):
            model = main_step(del_classList[i], del_classList[i + 1], True,
                              None)
            model.save_weights(
                './generated_models/temp_saves/model_weights.h5')
            with open('./generated_models/temp_saves/model.json', 'w') as fh:
                fh.write(model.to_json())
        else:
            with open('./generated_models/temp_saves/model.json', 'r') as fh:
                model = model_from_json(fh.read(), get_custom_objects())
            model.load_weights(
                './generated_models/temp_saves/model_weights.h5')
            model = main_step(del_classList[i], del_classList[i + 1], False,
                              model)
            model.save_weights(
                './generated_models/temp_saves/model_weights.h5')
            with open('./generated_models/temp_saves/model.json', 'w') as fh:
                fh.write(model.to_json())
    def test_decode(self):
        tokens = 'all work and no play makes jack a dull boy'.split(' ')
        token_dict = {
            '<PAD>': 0,
            '<START>': 1,
            '<END>': 2,
        }
        for token in tokens:
            if token not in token_dict:
                token_dict[token] = len(token_dict)
        model = get_model(
            token_num=len(token_dict),
            embed_dim=32,
            encoder_num=3,
            decoder_num=2,
            head_num=4,
            hidden_dim=128,
            dropout_rate=0.05,
        )
        model.compile(
            optimizer='adam',
            loss='sparse_categorical_crossentropy',
        )
        model.summary()
        encoder_inputs_no_padding = []
        encoder_inputs, decoder_inputs, decoder_outputs = [], [], []
        for i in range(1, len(tokens)):
            encode_tokens, decode_tokens = tokens[:i], tokens[i:]
            encode_tokens = ['<START>'] + encode_tokens + [
                '<END>'
            ] + ['<PAD>'] * (len(tokens) - len(encode_tokens))
            output_tokens = decode_tokens + [
                '<END>', '<PAD>'
            ] + ['<PAD>'] * (len(tokens) - len(decode_tokens))
            decode_tokens = ['<START>'] + decode_tokens + [
                '<END>'
            ] + ['<PAD>'] * (len(tokens) - len(decode_tokens))
            encode_tokens = list(map(lambda x: token_dict[x], encode_tokens))
            decode_tokens = list(map(lambda x: token_dict[x], decode_tokens))
            output_tokens = list(map(lambda x: [token_dict[x]], output_tokens))
            encoder_inputs_no_padding.append(encode_tokens[:i + 2])
            encoder_inputs.append(encode_tokens)
            decoder_inputs.append(decode_tokens)
            decoder_outputs.append(output_tokens)
        current_path = os.path.dirname(os.path.abspath(__file__))
        model_path = os.path.join(current_path, 'test_transformer.h5')
        if os.path.exists(model_path):
            model.load_weights(model_path, by_name=True)
        else:
            model.fit(
                x=[
                    np.asarray(encoder_inputs * 2048),
                    np.asarray(decoder_inputs * 2048)
                ],
                y=np.asarray(decoder_outputs * 2048),
                epochs=10,
                batch_size=128,
            )
            model.save(model_path)
        model = keras.models.load_model(model_path,
                                        custom_objects=get_custom_objects())
        decoded = decode(
            model,
            encoder_inputs_no_padding * 2,
            start_token=token_dict['<START>'],
            end_token=token_dict['<END>'],
            pad_token=token_dict['<PAD>'],
        )
        token_dict_rev = {v: k for k, v in token_dict.items()}
        for i in range(len(decoded)):
            print(' '.join(map(lambda x: token_dict_rev[x], decoded[i][1:-1])))
        for i in range(len(decoded)):
            for j in range(len(decoded[i])):
                self.assertEqual(decoder_inputs[i % len(decoder_inputs)][j],
                                 decoded[i][j])

        decoded = decode(
            model,
            encoder_inputs_no_padding[2] + [0] * 5,
            start_token=token_dict['<START>'],
            end_token=token_dict['<END>'],
            pad_token=token_dict['<PAD>'],
        )
        for j in range(len(decoded)):
            self.assertEqual(decoder_inputs[2][j], decoded[j], decoded)

        decoded = decode(
            model,
            encoder_inputs_no_padding,
            start_token=token_dict['<START>'],
            end_token=token_dict['<END>'],
            pad_token=token_dict['<PAD>'],
            max_len=4,
        )
        token_dict_rev = {v: k for k, v in token_dict.items()}
        for i in range(len(decoded)):
            print(' '.join(map(lambda x: token_dict_rev[x], decoded[i][1:-1])))
        for i in range(len(decoded)):
            self.assertTrue(len(decoded[i]) <= 4, decoded[i])
            for j in range(len(decoded[i])):
                self.assertEqual(decoder_inputs[i][j], decoded[i][j], decoded)

        decoded_top_5 = decode(
            model,
            encoder_inputs_no_padding,
            start_token=token_dict['<START>'],
            end_token=token_dict['<END>'],
            pad_token=token_dict['<PAD>'],
            max_len=4,
            top_k=5,
            temperature=1e-10,
        )
        has_diff = False
        for i in range(len(decoded)):
            s1 = ' '.join(map(lambda x: token_dict_rev[x], decoded[i][1:-1]))
            s5 = ' '.join(
                map(lambda x: token_dict_rev[x], decoded_top_5[i][1:-1]))
            if s1 != s5:
                has_diff = True
        self.assertFalse(has_diff)

        decoded_top_5 = decode(
            model,
            encoder_inputs_no_padding,
            start_token=token_dict['<START>'],
            end_token=token_dict['<END>'],
            pad_token=token_dict['<PAD>'],
            max_len=4,
            top_k=5,
        )
        has_diff = False
        for i in range(len(decoded)):
            s1 = ' '.join(map(lambda x: token_dict_rev[x], decoded[i][1:-1]))
            s5 = ' '.join(
                map(lambda x: token_dict_rev[x], decoded_top_5[i][1:-1]))
            if s1 != s5:
                has_diff = True
        self.assertTrue(has_diff)
            np.array(decode_input * DATA_MULTIPLIER)
        ],
                  y=np.array(decode_output * DATA_MULTIPLIER),
                  epochs=EPOCHS,
                  batch_size=BATCH_SIZE,
                  validation_split=VALIDATION_SPLIT)

        model.save_weights(os.path.join(MODEL_NAME, 'model_weights.h5'))

        # Save the model architecture
        with open(os.path.join(MODEL_NAME, 'model.json'), 'w') as fh:
            fh.write(model.to_json())
    else:
        # Model reconstruction from JSON file
        with open(os.path.join(MODEL_NAME, 'model.json'), 'r') as fh:
            model = model_from_json(fh.read(), get_custom_objects())

        # Load weights into the new model
        model.load_weights(os.path.join(MODEL_NAME, 'model_weights.h5'))

        model.compile('adam', 'sparse_categorical_crossentropy')
        model.summary()

    # Predict with beam search
    decoded = decode(
        model,
        encode_input,  # The test set
        start_token=target_token_dict['<START>'],
        end_token=target_token_dict['<END>'],
        pad_token=target_token_dict['<PAD>'],
        top_k=TOP_K,
Beispiel #5
0
# import flask
from flask import Flask, jsonify, render_template, request
from flask_cors import CORS

# import mode
import keras
from keras_transformer import get_custom_objects, get_model, decode
model = keras.models.load_model('./saved_model.hdf5',
                                custom_objects=get_custom_objects())

import numpy as np
#load vocab
#read dict
import json
with open('inp_dict.json', 'r') as inp_d:
    inp_dict = json.load(inp_d)
with open('tar_dict.json', 'r') as tar_d:
    tar_dict = json.load(tar_d)
with open('cst.json', 'r') as const:
    cst = json.load(const)

# configuration
DEBUG = True

# instantiate the app
app = Flask(__name__)
app.config.from_object(__name__)

# enable CORS
CORS(app, resources={r'/*': {'origins': '*'}})