【问题标题】:how do i solve this Error 'tuple' object is not an iterator我该如何解决这个错误'元组'对象不是迭代器
【发布时间】:2020-04-08 19:34:01
【问题描述】:

我是 AI 初学者,需要以下代码的帮助。

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)

我在训练模型时遇到此错误我很困惑我需要在对象中更改什么 元组?请帮帮我谢谢。

我收到此错误:

【问题讨论】:

  • 转换成列表?
  • 显示的错误消息与显示的代码无关。另外,请不要发布文本截图 - 复制和粘贴文本,并使用格式化工具。
  • @KarlKnechtel 感谢您指出这一点。我应该清除自己错误出现在这一行,如上图model.fit_generator( traincall, epochs=epochs,steps_per_epoch=steps_per_epoch,verbose=1, callbacks=callbacks, validation_data=valcall) 所示,并且该行出现在 train_model 函数中,该函数发生错误,如屏幕截图所示。

标签: python tensorflow keras artificial-intelligence keras-layer


【解决方案1】:

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 循环会为您获取列表迭代器iter(some_list)

  2. 一些可迭代对象,如类文件对象,充当它们自己的迭代器。

    >>> f = open(".zshrc")
    >>> f is iter(f)
    True
    

【讨论】:

  • 您的解释很有帮助,谢谢!
【解决方案2】:

问题出在 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) 

【讨论】:

    猜你喜欢
    • 2023-02-06
    • 2020-04-01
    • 2021-04-19
    • 2016-07-21
    • 2016-09-09
    • 2020-07-25
    相关资源
    最近更新 更多