Моя проблема в том, что у меня большая разница во времени вычисления между двумя функциями, которые делают одно и то же.
Цель этой функции - генерировать благодарность рекурентному
нейронная сеть конец предложения.
- В первой функции первые буквы каждого предложения будут генерироваться случайным образом.
- Во второй функции я даю семя в качестве параметра, который будет началом предложения.
Некоторые дополнительные сведения:
Мой р-н генерирует предложение буква за буквой, а не слово за
слово.
Буквы имеют одну горячую кодировку
Сеть работает с пакетной обработкой, поэтому размер входного вектора имеет вид: [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 разных предложения
но принцип действия такой же, и проблема в том, что
вторая функция экспоненциально длиннее первой согласно
размер последовательности
Я был бы очень признателен, если бы вы помогли мне решить эту проблему, потому что я очень не понимаю разницу во времени обработки ..
Я также знаю, что эти функции вообще не оптимизированы, я просто хочу понять, почему существует такая разница во времени вычислений