Как я могу решить эту ошибку 'Tuple' объект не является итератором - PullRequest
0 голосов
/ 08 апреля 2020

Я новичок в ИИ, мне нужна помощь в следующем коде.

valcall = val_images,Yval_images
traincall = train_images,Ytrain_images

callbacks = [
     EarlyStopping(monitor='val_loss', patience=15, verbose=1, min_delta=1e-5),
     ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=5, cooldown=0, verbose=1, min_lr=1e-8),
     ModelCheckpoint(monitor='val_loss', filepath='/content/drive/My Drive/TPU/testchange.hdf5', verbose=1,save_best_only=True, save_weights_only=True, mode='auto')

    ]

    model.fit_generator( traincall, epochs=epochs,steps_per_epoch=steps_per_epoch,verbose=1, callbacks=callbacks, validation_data=valcall)

Я получаю эту ошибку при обучении модели, я запутался, что кортеж нужно мне изменить в объекте? Пожалуйста, помогите мне, спасибо.

Я получаю эту ошибку: enter image description here

Ответы [ 2 ]

3 голосов
/ 08 апреля 2020

Существует различие между итерируемым значением и итератором в Python. Итерируемое значение (например, tuple) - это значение, которое вы можете передать iter и получить для него итератор.

>>> t = (1, 2)
>>> type(t)
<class 'tuple'>
>>> type(iter(t))
<class 'tuple_iterator'>

Итератор - это то, что вы можете передать next и получить обратно. следующее значение, определяемое внутренним состоянием итератора.

>>> itr = iter(t)
>>> next(itr)
1
>>> next(itr)
2

Как видите, кортеж является итеративным, но не итератором.


Есть две причины, ИМО, почему это различие часто пропускается.

  1. Большинство итераторов используются в функциях и конструкциях, которые запрашивают итератор из итерируемого, то есть вам редко приходится работать с итераторами напрямую. Например, вы можете написать for i in some_list: ..., но for l oop получает для вас итератор списка iter(some_list).

  2. Некоторые итерируемые объекты, такие как файловые объекты , действуйте как свои собственные итераторы.

    >>> f = open(".zshrc")
    >>> f is iter(f)
    True
    
1 голос
/ 09 апреля 2020

Проблема была в 1-м аргументе Fit_generator 'traincall' , я передавал две переменные, содержащие несколько изображений.

traincall = train_images,Ytrain_images

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

datagen = ImageDataGenerator(shear_range=0.2, zoom_range=0.2, rotation_range=20, horizontal_flip=True)
def image_a_b_gen(images, batch_size):
    while True:
        for batch in datagen.flow(images, batch_size=batch_size):
            yield getImages(batch) 
...