ValueError: не удалось передать входной массив из фигуры (97,2048) в фигуру (97), когда я пытаюсь выполнить fit_generator () - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь повторить код из этого 1 . Используется набор данных flickr 8k, и у каждого изображения есть 5 подписей, но здесь я использую 3 вместо 5.

Мой caption_model это: enter image description here. Лучшее представление: enter image description here

Я использую следующие объекты:

  1. training_captions: Это дикт с ключами 8k +, и каждый ключ имеет список из 3 заголовков.
  2. images: это также дикт с ключами 8k +, и каждый ключ отображается в массив, имеющий форму (2048,)
  3. vocab_size: это размер списка уникальных слов, число которых в данном случае превышает пороговое значение, равное 10. В этом случае длина списка равна 2035.
  4. wordtoix: где каждое слово отображается в целое число.
  5. max_length : Максимальная длина заголовка. В данном случае это 74, и с помощью этого мы добавляем каждый заголовок к этой длине.

Теперь я использую это для создания генератора,

def data_generator(descriptions, photos, wordtoix, max_length, num_photos_per_batch):
    X1, X2, y = list(), list(), list()
    n=0
    # loop for ever over images
    while 1:
        for key, desc_list in descriptions.items():
            n+=1
            # retrieve the photo feature
            photo = photos[key]
            for desc in desc_list:
                # encode the sequence
                seq = [wordtoix[word] for word in desc.split(' ') if word in wordtoix]
                # split one sequence into multiple X, y pairs
                for i in range(1, len(seq)):
                    # split into input and output pair
                    in_seq, out_seq = seq[:i], seq[i]
                    # pad input sequence
                    in_seq = pad_sequences([in_seq], maxlen=max_length)[0]
                    # encode output sequence
                    out_seq = to_categorical([out_seq], num_classes=vocab_size)[0]
                    # store
                    X1.append(photo)
                    X2.append(in_seq)
                    y.append(out_seq)
            # yield the batch data
            if n==num_photos_per_batch:
                print(array([[array(X1), array(X2)], array(y)]).shape)
                yield [[array(X1), array(X2)], array(y)]
                X1, X2, y = list(), list(), list()
                n=0
  • Элемент списка

Когда я пытаюсь сделать

    for i in tqdm(range(EPOCHS*2)):
        generator= data_generator(training_captions, images, wordtoix, max_length, number_pics_per_bath)
        caption_model.fit_generator(generator, epochs=1, steps_per_epoch=steps, verbose=1)

Я получаю ошибку

* 1 034 *

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

1 Ответ

0 голосов
/ 17 января 2020

Причина, по которой я спросил о массивах с формой, подобной (97,2048), заключается в том, что сообщение об ошибке такого типа появляется в конструкции, например:

In [109]: np.asarray([np.ones((3,4)),np.zeros((3,2))])                                           
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-109-3d43433206a6> in <module>
----> 1 np.asarray([np.ones((3,4)),np.zeros((3,2))])

/usr/local/lib/python3.6/dist-packages/numpy/core/_asarray.py in asarray(a, dtype, order)
     83 
     84     """
---> 85     return array(a, dtype, copy=False, order=order)
     86 
     87 

ValueError: could not broadcast input array from shape (3,4) into shape (3)

Это пытается объединить (3,4) и (3,2) фасонные массивы в один. Обратите внимание на соответствующее первое измерение. Если бы первые измерения отличались, результатом был бы массив dtype объекта, массив массивов. Если бы все измерения были одинаковыми, результатом был бы массив (2,3,4).

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

В этой ошибке 2-е измерение отличается. Поэтому, если у вас есть список массивов, имеющих форму (n, 2048), но где один или два (n, 2035), вы можете получить эту ошибку. Я бы тщательно проверил размер изображений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...