Ejemplo n.º 1
0
def interactive_prompt(model: keras.Sequential, vectorizer: Vectorizer):
    def get_input():
        user_input = input('Enter seed word(s) [Ctrl-C to quit]: ')
        user_input = user_input.lower()
        return user_input

    def one_hot(index):
        res = np.zeros(vectorizer.vocab_size, dtype=np.int64)
        res[index] = 1
        return res

    try:
        while True:
            probs_arr = []

            user_input = get_input()
            model.reset_states()
            pred_ids = []
            for token_id in vectorizer.text_to_vector(user_input):
                pred_ids.append(token_id)
                probs = feed_token(model, token_id)
                pred_id = probs.argmax()
                # probs_arr.append(probs)
                probs_arr.append(one_hot(pred_id))
            pred_ids.append(pred_id)

            for t in range(500):
                probs = feed_token(model, pred_ids[-1])
                # probs_arr.append(probs)
                pred_ids.append(probs.argmax())

            pred_words = vectorizer.sequences_to_docs([[pred_ids]])
            assert len(pred_words) == 1, pred_words
            pred_words = pred_words[0]

            pred_words = ' '.join([
                sent.capitalize()
                for sent in vectorizer.sent_tokenize(pred_words)
            ])

            print(pred_words)

            # print('<>~' * 15)
            # sequences = beam_search_decoder(probs_arr, k=2)
            # sequences = [thing[0] for thing in sequences]
            # beam_rant = vectorizer.sequences_to_docs([sequences])
            # print('beam rant:', beam_rant)
    except KeyboardInterrupt:
        print('Ok bye.')
def train_model(X, Y, X_test, Y_test, nr_steps):
    n_batch = 14000
    n_epoch = 1000
    n_neurons = 30

    # design network
    model = Sequential()
    model.add(
        LSTM(units=n_neurons,
             return_sequences=True,
             batch_input_shape=(n_batch, X.shape[1], X.shape[2]),
             stateful=True))

    model.add(Dropout(0.2))

    # Adding a second LSTM layer and Dropout layer
    model.add(LSTM(units=n_neurons, return_sequences=True))
    model.add(Dropout(0.2))

    model.add(Dense(1))
    optimizer = optimizers.Adam(clipvalue=0.5)
    model.compile(loss='mean_squared_error',
                  optimizer=optimizer,
                  metrics=['acc'])

    for z in range(0, len(X) // 4, n_batch):
        xChunk = X[z:z + n_batch]
        yChunk = Y[z:z + n_batch]

        model.fit(xChunk,
                  yChunk,
                  epochs=n_epoch,
                  batch_size=n_batch,
                  verbose=1,
                  shuffle=False)
        model.reset_states()

    yhat = model.predict(X_test[0:n_batch, :, :],
                         batch_size=n_batch,
                         steps=nr_steps)
    for i in range(len(Y_test[0:n_batch])):
        print("Extected : " + str(Y[i]) + " but actually: " + str(yhat[i][0]))
    error = 1
    for j in range(len(Y_test[0:n_batch])):
        error = error * (abs(Y_test[j] - yhat[j][0]) / yhat[j][0]) * 100
    print("error:   " + str(error) + "%")
Ejemplo n.º 3
0
def ramble(model: keras.Sequential, vectorizer: Vectorizer, seed='she'):
    current_token = vectorizer.word_to_index[seed]
    current_seq = [current_token]
    model.reset_states()
    model.summary()

    probs_arr = []

    # for t in range(config.max_seq_len):
    for t in range(5):
        # Format inputs.
        inputs = np.zeros((config.find('batch_size'), 1))
        assert inputs.shape[0] == 32, inputs.shape
        inputs[0, 0] = current_token

        # Forward pass.
        probs = model.predict_on_batch(inputs)[0]
        probs = probs.squeeze()
        probs_arr.append(probs)
        assert probs.shape == (vectorizer.vocab_size,
                               ), f'{probs.shape} != {vectorizer.vocab_size}'

        # Sample prediction.
        current_token = probs.argmax()
        current_seq.append(current_token)

    text_rant = vectorizer.sequences_to_docs([[current_seq]])
    assert len(text_rant) == 1, len(text_rant)

    # Some post-processing prettification.
    text_rant = util.lmap(str.strip, text_rant[0].split('.'))
    util.print_box('Rant', list(text_rant))

    sequences = beam_search_decoder(probs_arr, k=3)
    sequences = [thing[0] for thing in sequences]
    beam_rant = vectorizer.sequences_to_docs([sequences])
    print('beam rant:', beam_rant)
  model.add(LSTM(4, input_shape=(look_back, 1)))
elif type_ == 'b':
  model.add(LSTM(4, batch_input_shape=(batch_size, look_back, 1), stateful=True))
elif type_ == 'c':
  model.add(LSTM(4, batch_input_shape=(batch_size, look_back, 1), stateful=True, return_sequences=True))
  model.add(LSTM(4, batch_input_shape=(batch_size, look_back, 1), stateful=True))
else:
  model.add(LSTM(4, input_shape=(1, look_back)))
  
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')

if type_ == 'b' or type_ == 'c':
  for i in range(1):
    model.fit(trainX, trainY, epochs=1, batch_size=batch_size, verbose=2, shuffle=False)
    model.reset_states()
else:
  history = model.fit(trainX, 
              trainY, 
              epochs = epochs, 
              batch_size = 1, 
              verbose = 2)
  
  # Make predictions
if type_ == 'b' or type_ == 'c':
  trainPredict = model.predict(trainX, batch_size=batch_size)
  testPredict = model.predict(testX, batch_size=batch_size)
else:
  trainPredict = model.predict(trainX)
  testPredict = model.predict(testX)