Странная разница во времени обработки между двумя довольно похожими функциями - PullRequest
0 голосов
/ 19 июня 2019

Моя проблема в том, что у меня большая разница во времени вычисления между двумя функциями, которые делают одно и то же.

Цель этой функции - генерировать благодарность рекурентному нейронная сеть конец предложения.

  • В первой функции первые буквы каждого предложения будут генерироваться случайным образом.
  • Во второй функции я даю семя в качестве параметра, который будет началом предложения.

Некоторые дополнительные сведения:

  • Мой р-н генерирует предложение буква за буквой, а не слово за слово.

  • Буквы имеют одну горячую кодировку

  • Сеть работает с пакетной обработкой, поэтому размер входного вектора имеет вид: [batch_size, sequence_size, vocabulary_size]

sequence_size не является константой, потому что я хочу, чтобы моя сеть могла генерировать более короткие или более длинные предложения

Итак, есть две функции:

def gen_text(length, vocab_size):

    generated   = ['']*BATCH_SIZE
    seed        = []
    input_      = []

    # Seeds generation
    for i in range(0, BATCH_SIZE):
        seed.append(random.randint(1, vocab_size)-1)
        input_.append([one_hot(seed[i], vocab_size)])
        generated[i] += int_to_vocab[str(seed[i])]

    # Text generation loop
    for i in range(0, length):

        model.reset_states()
        output = model.predict([input_])

        # Add the last outputed value for each batch in the input vector
        for j in range(0, BATCH_SIZE):
            encoded     = [0.0] * vocab_size
            last_output = output[j][i]
            encoded[np.argmax(last_output)] = 1.0
            generated[j] += int_to_vocab[str(flat_hot(encoded))]
            input_[j].append(last_output)

    return generated

Вторая функция

def gen_text_seed(length, seed, vocab_size):

    generated   = ''
    input_      = []

    seed_seq = []
    for i in range(0, len(seed)):

        seed_seq.append(one_hot(vocab_to_int[seed[i]], vocab_size))
        generated += seed[i]

    # Stack the same sequence BATCH_SIZE times
    for i in range(0, BATCH_SIZE):

        input_.append(seed_seq)

    # Text generation loop
    for i in range(len(seed)-1, length):

        model.reset_states()
        output = model.predict([input_])

        # Add the last outputed value for each batch in the input vector
        for j in range(0, BATCH_SIZE):
            encoded     = [0.0] * vocab_size
            last_output = output[j][i]
            encoded[np.argmax(last_output)] = 1.0
            input_[j].append(last_output)

        # Add the generated char to the generated sentence
        generated += int_to_vocab[str(flat_hot(encoded))]

    return generated

Некоторые другие сведения, чтобы прояснить ситуацию:

  • int_to_vocab или vocab_to_int просто являются словарями, которые связывают символ с целым числом
  • one_hot - это функция, которая дает мне одно горячее представление целого в интервале
  • flat_hot выполняет обратную операцию
  • one_hots и flat_hots делают то же самое со списком значений

То, что я делаю во второй функции, немного странно: я копирую то же самое время семян batch_size в моем входном векторе, потому что я только начинаю работать с клетками RNN и LSTM , и я не нашел, как не использовать пакет для прогноза, если я использовал партии для обучения ... Так как вывод вторая функция у меня только 1 предложение (то же самое время batch_size) по сравнению с первым, в котором я генерирую 64 разных предложения но принцип действия такой же, и проблема в том, что вторая функция экспоненциально длиннее первой согласно размер последовательности

Я был бы очень признателен, если бы вы помогли мне решить эту проблему, потому что я очень не понимаю разницу во времени обработки ..

Я также знаю, что эти функции вообще не оптимизированы, я просто хочу понять, почему существует такая разница во времени вычислений

...