예제 #1
0
def generate(net, seed_string='A', predict_length=100, temperature=0.8, cuda=None):
    hidden = net.init_hidden(1, cuda=cuda)
    if cuda is not None:
        prime_input = Variable(common.char_tensor(seed_string).unsqueeze(0).cuda(device=cuda))
    else:
        prime_input = Variable(common.char_tensor(seed_string).unsqueeze(0))

    # Use seed string to "build up" hidden state
    predicted = seed_string
    for p in range(len(seed_string) - 1):
        _, hidden = net(prime_input[:, p], hidden)

    inp = prime_input[:, -1]
    for p in range(predict_length):
        output, hidden = net(inp, hidden)
        # Sample from the network as a multinomial distribution
        output_dist = output.data.view(-1).div(temperature).exp()
        top_i = torch.multinomial(output_dist, 1)[0]

        # Add predicted character to string and use as next input
        predicted_char = common.trainable_characters[top_i]
        predicted += predicted_char
        if cuda is not None:
            inp = mythic_model_character.Variable(common.char_tensor(predicted_char).unsqueeze(0).cuda(cuda))
        else:
            inp = mythic_model_character.Variable(common.char_tensor(predicted_char).unsqueeze(0))

    return predicted
예제 #2
0
def generate(decoder, seed_string='A', predict_length=100, temperature=0.8, cuda=False):
    hidden = decoder.init_hidden(1)
    prime_input = mythic_model_character.Variable(common.char_tensor(seed_string).unsqueeze(0))

    if cuda:
        hidden = hidden.cuda()
        prime_input = prime_input.cuda()
    predicted = seed_string

    # Use priming string to "build up" hidden state
    for p in range(len(seed_string) - 1):
        _, hidden = decoder(prime_input[:, p], hidden)

    inp = prime_input[:, -1]

    for p in range(predict_length):
        output, hidden = decoder(inp, hidden)

        # Sample from the network as a multinomial distribution
        output_dist = output.data.view(-1).div(temperature).exp()
        top_i = torch.multinomial(output_dist, 1)[0]

        # Add predicted character to string and use as next input
        predicted_char = common.trainable_characters[top_i]
        predicted += predicted_char
        inp = mythic_model_character.Variable(common.char_tensor(predicted_char).unsqueeze(0))
        if cuda:
            inp = inp.cuda()

    return predicted
def random_training_set():
    inp = model.torch.LongTensor(settings.batch_size, settings.chunk_size)
    target = model.torch.LongTensor(settings.batch_size, settings.chunk_size)
    for bi in range(settings.batch_size):
        start_index = random.randint(
            0, settings.text_length - settings.chunk_size - 1)
        end_index = start_index + settings.chunk_size + 1
        chunk = settings.text_string[start_index:end_index]
        inp[bi] = common.char_tensor(chunk[:-1])
        target[bi] = common.char_tensor(chunk[1:])
    inp = model.Variable(inp)
    target = model.Variable(target)
    if settings.cuda is not None:
        inp = inp.cuda()
        target = target.cuda()
    return inp, target
def ordered_training_set(start_index):
    if start_index > (settings.text_length - settings.chunk_size):
        log.out.warning(
            "Requested index would blow bounds in text array, setting to random."
        )
        start_index = random.randint(
            0, settings.text_length - settings.chunk_size)
    inp = model.torch.LongTensor(settings.batch_size, settings.chunk_size)
    target = model.torch.LongTensor(settings.batch_size, settings.chunk_size)
    for bi in range(settings.batch_size):
        # start_index = random.randint(0, settings.text_length - settings.chunk_size)
        end_index = start_index + settings.chunk_size + 1
        chunk = settings.text_string[start_index:end_index]
        inp[bi] = common.char_tensor(chunk[:-1])
        target[bi] = common.char_tensor(chunk[1:])
    inp = model.Variable(inp)
    target = model.Variable(target)
    if settings.cuda:
        inp = inp.cuda()
        target = target.cuda()
    return inp, target, end_index