Проблема с размерами слоя при использовании генератора последовательностей Keras и fit_generator - PullRequest
0 голосов
/ 28 марта 2020
  • Я запускаю визуальное задание по ответу на вопрос .
  • Проблемы принимают как вход: изображение функции (которые я сохранил в h5py файл) и токены вопросов (которые я выбрал), а выходные данные - ответы (весь ответ считается целью, поэтому 3129 ответов - одно слово или более - и 3129 меток)
  • Я использую утилиту последовательности Keras для создания generator.
  • Я получаю ошибку измерения в выходном слое, когда модель обучается. когда я изменяю функцию len , в зависимости от ее значения процесс обучения прерывается
  • Я скопировал свою функцию getitem в генератор, а также образец моей модели.

Нужно ли изменить мою конфигурацию генератора или мою модель?

Epoch 1/1
Traceback (most recent call last):
  File "<ipython-input-45-e55a5853e499>", line 32, in <module>
    validation_data=valid_generator)
  File "C:\python\envs\tf2-keras\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper
    return func(*args, **kwargs)
  File "C:\python\envs\tf2-keras\lib\site-packages\keras\engine\training.py", line 1732, in fit_generator
    initial_epoch=initial_epoch)
  File "C:\python\envs\tf2-keras\lib\site-packages\keras\engine\training_generator.py", line 220, in fit_generator
    reset_metrics=False)
  File "C:\python\envs\tf2-keras\lib\site-packages\keras\engine\training.py", line 1508, in train_on_batch
    class_weight=class_weight)
  File "C:\python\envs\tf2-keras\lib\site-packages\keras\engine\training.py", line 621, in _standardize_user_data
    exception_prefix='target')
  File "C:\python\envs\tf2-keras\lib\site-packages\keras\engine\training_utils.py", line 145, in standardize_input_data
    str(data_shape))

ValueError: Error when checking target: expected output to have shape (3129,) but got array with shape (1,)
def __len__(self):
'Denotes the number of batches per epoch'
# return int(np.floor(len(self.list_IDs) / self.batch_size))
return 512*866

# this is the getitem function 
The __getitem__ of my generator look like this:
    def __getitem__(self, index):
        'Generate one batch of data'

        imfeatures      = np.empty((self.batch_size,2048))
        question_tokens = np.empty((self.batch_size,14))
        answers         = np.empty((self.batch_size,3129))

        # Generate indexes of the batch
        indexes = self.indexes[index*self.batch_size:(index+1)*self.batch_size]
        # self.T.append(indexes)
        list_IDs_temp = [self.list_IDs[k] for k in indexes]

        # Generate data
        for i,k in enumerate(list_IDs_temp):
            temp =self.Features['image_features'][k]
            imfeatures[i,]=temp[0,:]
            question_tokens[i,]=self.Questions[indexes[i]]
            answers=self.Answer[indexes[i]]

        return [imfeatures,question_tokens],answers
# this is  where I instantiate the generators
#train_features is h5py file 
# entries is where questions, answers, and ids are saved
batch_size=512
train_generator  = DataGenerator(entries['train'].images,
                                  train_fetures,
                                  entries['train'].q_token,
                                  entries['train'].target,
                                  batch_size=batch_size,
                                  shuffle = False)

valid_generator  = DataGenerator(entries['val'].images,
                                  valid_features,
                                  entries['val'].q_token,
                                  entries['val'].target,
                                  batch_size=batch_size,
                                  shuffle = False) 
#And this is what my model looks like:

ImInput = Input(shape=(2048,),name='image_input')
QInput = Input(shape=(14,),name='question')

# some dense layers and dropouts

#Then the layers are merged

M =Multiply()[ImInput,QInput]
#Some dense layers and dropouts

output=Dense(3129,activation='softmax',name='output')(M)

model = Model([ImInput,QInput ],output)
model.compile(optimizer='RMSprop',loss='categorical_crossentropy',metrics = ['accuracy'])

model.fit_generator(train_generator,
                              epochs=1,
                              verbose =1,
                              validation_data=valid_generator)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...