Вопрос или проблема
Я пытаюсь подогнать модель с использованием генератора и получаю следующую ошибку:
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
возвращаются другие значения, вам нужно будет соответственно адаптировать ваш код.
Дополнительные советы по отладке
-
Отладка структуры данных: Перед вызовом
model.fit_generator
, полезно вывести формы входных данных, чтобы убедиться, что они соответствуют ожидаемым формам. Это можно сделать, добавив вывод в генератор. -
Проверка модели: Убедитесь, что ваша модель действительно принимает два входа. Это можно сделать, проверив архитектуру модели с помощью
model.summary()
. -
Версия TensorFlow: Если использовали старую версию TensorFlow, попробуйте обновить её, так как с более новыми версиями может быть связано изменение поведения API.
Заключение
Эта проблема возникает часто при работе с моделями в TensorFlow/Keras. Правильное управление форматом данных, которые подаются в модель, критически важно для успешного обучения. Надеюсь, предложенное решение поможет вам устранить возникшую ошибку и продолжить обучение вашей модели. Если возникнут дополнительные вопросы, не стесняйтесь обращаться за поддержкой.