ValueError: Слой модели ожидает 2 входа, но получил 3 входных тензора, используя генератор.

Вопрос или проблема

Я пытаюсь подогнать модель с использованием генератора и получаю следующую ошибку:

ValueError: Слой модели ожидает 2 входа, но получил 3 входных тензора. Полученные входы: [<tf.Tensor 'IteratorGetNext:0' shape=(None, None) dtype=float32>, <tf.Tensor 'IteratorGetNext:1' shape=(None, None) dtype=int32>, <tf.Tensor 'IteratorGetNext:2' shape=(None, None) dtype=float32>]

Вот код:

    try:
  os.mkdir("/content/drive/MyDrive/Colab Notebooks/iCap/models")
except:
  pass
for i in range(epochs):
    generator = data_generator(train_descriptions, train_features, tokenizer, max_length)
    model.fit_generator(generator, epochs=1, steps_per_epoch= steps, verbose=1)
    model.save("/content/drive/MyDrive/Colab Notebooks/iCap/models/model_" + str(i) + ".h5")

А вот функция data_generator, которую я использую:

    def data_generator(descriptions, features, tokenizer, max_length):
    while 1:
        for key, description_list in descriptions.items():
            #получить характеристики фото
            feature = features[key][0]
            input_image, input_sequence, output_word = create_sequences(tokenizer, max_length, description_list, feature)
            yield [[input_image, input_sequence], output_word]

Может кто-то из вас помочь решить эту проблему?

Спасибо.

Проблема в функции data_generator.

Сделайте это:

def data_generator(descriptions, features, tokenizer, max_length):
while 1:
    for key, description_list in descriptions.items():
        #получить характеристики фото
        feature = features[key][0]
        input_image, input_sequence, output_word = create_sequences(tokenizer, max_length, description_list, feature)
        yield ([input_image, input_sequence], output_word)

просто измените yield на кортеж из списка.

Ответ или решение

Ошибка ValueError: Layer model expects 2 input(s), but it received 3 input tensors указывает на то, что модель ожидает два входных тензора, однако получает три. Проблема заключается в реализации генератора данных, который передает неправильное количество входных данных в модель. Давайте рассмотрим, как можно решить эту проблему, исходя из предоставленного вами кода.

Понимание ошибки

Ошибка возникает из-за того, что функция yield в вашем генераторе data_generator возвращает список в формате [[input_image, input_sequence], output_word]. Это создаёт дополнительный уровень вложенности. К тому же, модель ожидает кортеж, а не список.

Решение

Чтобы исправить эту ошибку, вам нужно изменить код генератора так, чтобы он возвращал кортеж, состоящий из двух элементов: входных данных (которые сами являются кортежем) и выходных данных. Это можно сделать следующим образом:

def data_generator(descriptions, features, tokenizer, max_length):
    while 1:
        for key, description_list in descriptions.items():
            # Извлекаем особенности фотографии
            feature = features[key][0]
            input_image, input_sequence, output_word = create_sequences(tokenizer, max_length, description_list, feature)
            yield ([input_image, input_sequence], output_word)

Пояснение изменений

  • Использование кортежа: Я изменил yield [[input_image, input_sequence], output_word] на yield ([input_image, input_sequence], output_word). Это убирает лишний список, и теперь у вас получается кортеж, соответствующий ожиданиям модели.
  • Проверка входных данных: Убедитесь, что функция create_sequences действительно возвращает два значения: input_image и input_sequence. Если в результате create_sequences возвращаются другие значения, вам нужно будет соответственно адаптировать ваш код.

Дополнительные советы по отладке

  1. Отладка структуры данных: Перед вызовом model.fit_generator, полезно вывести формы входных данных, чтобы убедиться, что они соответствуют ожидаемым формам. Это можно сделать, добавив вывод в генератор.

  2. Проверка модели: Убедитесь, что ваша модель действительно принимает два входа. Это можно сделать, проверив архитектуру модели с помощью model.summary().

  3. Версия TensorFlow: Если использовали старую версию TensorFlow, попробуйте обновить её, так как с более новыми версиями может быть связано изменение поведения API.

Заключение

Эта проблема возникает часто при работе с моделями в TensorFlow/Keras. Правильное управление форматом данных, которые подаются в модель, критически важно для успешного обучения. Надеюсь, предложенное решение поможет вам устранить возникшую ошибку и продолжить обучение вашей модели. Если возникнут дополнительные вопросы, не стесняйтесь обращаться за поддержкой.

Оцените материал
Добавить комментарий

Капча загружается...