Ошибка генератора, помогите понять пожалуйста!
Я изучаю генерацию текста при помощи модели Sequence-to-Sequence и столкнулся с проблемой, которую не могу решить. Описание : Обучаю нейросеть на базе вопросов и ответов. Когда подготавливаю раскодированные данные получаю следующие размерности тензоров:
tokenizedAnswers = tokenizer.texts_to_sequences(answers) ### разбиваем текст ответов на последовательности индексов
for i in range(len(tokenizedAnswers)) :
tokenizedAnswers[i] = tokenizedAnswers[i][1:] #### для разбитых на последовательности ответов избавляемся от тега START
paddedAnswers = pad_sequences(tokenizedAnswers, maxlen=maxLenAnswers , padding='post') ### Делаем последовательности одной длины, заполняя нулями более короткие ответы
decoderForOutput = utils.to_categorical(paddedAnswers, vocabularySize) ### переводим в one hot vector
На этом этапе в переменной paddedAnswers находится двумерный numpy тензор, размером (4594, 25) что соответствует моей базе, а в переменной decoderForOutput находится трехмерный numpy тензор, размером (4594, 25, 10785). Что тоже соответствует моей базе.
paddedAnswers.shape ### (4594, 25)
decoderForOutput.shape ### (4594, 25, 10785)
Здесь же с целью экономии памяти я бы хотел использовать генераторы Python. Для этой цели я создаю две функции генератора
def generator_from_two_dimensional_tensor(arg):
for i in range(arg.shape[0]):
for j in range(arg.shape[1]):
yield arg[i, j]
def generator_from_three_dimensional_tensor(arg):
for i in range(arg.shape[0]):
for j in range(arg.shape[1]):
for k in range(arg.shape[2]):
yield arg[i, j, k]
И подставляю эти функции в свой код следующим образом. Так же из токенизированных ответов тоже делаю генератор:
tokenizedAnswer = tokenizer.texts_to_sequences(answers)
for i in range(len(tokenizedAnswer)):
tokenizedAnswer[i] = tokenizedAnswer[i][1:]
generator_tokenized_answers = (x for x in tokenizedAnswer)
gen_paddedAnswers = generator_from_two_dimensional_tensor(pad_sequences([x for x in generator_tokenized_answers], maxlen=maxLenAnswers , padding='post'))
decoderForOutput = generator_from_three_dimensional_tensor(utils.to_categorical([x for x in gen_paddedAnswers], vocabularySize))
Код срабатывает, никакую ошибку не выдаёт. Но в момент, когда пытаюсь обучить сеть, я получаю ошибку:
history = model.fit([[x for x in gen_encoderForInput], [y for y in gen_decoderForInput]], [z for z in decoderForOutput], batch_size=50, epochs=20)
<ipython-input-6-a3a67c64deaf> in generator_three_tensor(arg)
2 for i in range(arg.shape[0]):
3 for j in range(arg.shape[1]):
----> 4 for k in range(arg.shape[2]):
5 yield arg[i, j, k]
6
IndexError: tuple index out of range
Для меня до сих пор остаётся загадкой, почему так происходит...