【问题标题】:Keras fit generator - ValueError: Failed to find data adapter that can handle inputKeras 适合生成器 - ValueError:找不到可以处理输入的数据适配器
【发布时间】:2020-05-30 12:39:15
【问题描述】:

我正在尝试使用自定义生成器来拟合我的深度学习模型。

当我拟合模型时,它显示了这个错误:

我试图找到类似的问题,但所有的答案都是关于将列表转换为 numpy 数组。我认为这不是这个错误的问题。我的列表都是 numpy 数组格式。这个自定义生成器基于来自here的自定义生成器

这是我适合模型的代码部分:

        train_generator = RepresentationGenerator(representation_path=representations_path, target_path=target_path,
                                              filenames=training_filenames, batch_size=batch_size)
    val_generator = RepresentationGenerator(representation_path=representations_path, target_path=target_path,
                                            filenames=validation_filenames, batch_size=batch_size)
    self.model_semantic.fit_generator(train_generator,
                            epochs=10,
                            verbose=1,
                            validation_data=val_generator,
                            )
    return 0

变量在哪里:

  • representations_path - 是一个字符串,其中包含我存储训练文件的路径的目录,该文件是模型的输入
  • target_path - 是一个字符串,其中包含我存储目标文件的路径的目录,哪个文件是模型的目标(输出)
  • training_filenames - 是一个包含训练和目标文件名称的列表(两者具有相同的名称,但它们位于不同的文件夹中)
  • batch_size - 批处理大小的整数。它的值为 7。

我的生成器类如下:

import np
from tensorflow_core.python.keras.utils.data_utils import Sequence
class RepresentationGenerator(Sequence):

    def __init__(self, representation_path, target_path, filenames, batch_size):
        self.filenames = np.array(filenames)
        self.batch_size = batch_size
        self.representation_path = representation_path
        self.target_path = target_path

    def __len__(self):
        return (np.ceil(len(self.filenames) / float(self.batch_size))).astype(np.int)

    def __getitem__(self, idx):
        files_to_batch = self.filenames[idx * self.batch_size: (idx + 1) * self.batch_size]
        batch_x, batch_y = [], []
        for file in files_to_batch:
            batch_x.append(np.load(self.representation_path + file + ".npy", allow_pickle=True))
            batch_y.append(np.load(self.target_path + file + ".npy", allow_pickle=True))

        return np.array(batch_x), np.array(batch_y)

当调用 fit 方法时,这些是值:

我该如何解决这个错误?

谢谢小伙伴们!


当我调用 fit_generator 方法时,它会调用 fit 方法。

方法fit,调用方法func.fit,传递设置为None的变量Y

错误出现在这一行:

【问题讨论】:

    标签: python tensorflow keras error-handling generator


    【解决方案1】:

    最终解决方案:

    从正确的地方导入:

    from tensorflow.keras.utils import Sequence
    

    旧答案:

    如果从未调用过__getitem__,则问题可能出在__len__。您返回的不是int,而是np.int

    我建议你试试:

    def __len__(self):
        length = len(self.filenames) // self.batch_size
        if len(self.filenames) % self.batch_size > 0:
            length += 1
    
        return length
    

    但是如果__getitem__ 被调用并且您的数据被返回,那么您应该检查您的数组。

    自己从生成器中获取一个项目并检查内容:

    x, y = train_generator[0]
    
    • 它们是单个数组吗?或者它们是数组的数组? (必须单身)
    • 它们的形状是什么?它们是否具有预期的形状?
    • 它们的类型是什么?通常它们应该是float,有时应该是int(用于嵌入层的输入),很少是string(用于知道如何处理字符串的自定义层的输入)。
      • 输出必须始终为float,最多为int(用于稀疏损失)

    其他假设,您在使用生成器时将fitbatch_size 一起使用......这很奇怪,并且方法中的“if”子句可能没有做好充分准备,您可能会陷入另一个训练案例。

    直接进入常用选项:

    self.model_semantic.fit_generator(train_generator, 
                                     epochs=10,
                                     verbose=1,
                                     validation_data=val_generator)
    

    您的生成器是Sequence,它已经有一个__len__,您不需要指定steps_per_epochvalidation_steps
    每个生成器都有自动批量大小,每一步都是一个批次,仅此而已。您无需在fit_generator 中指定batch_size

    如果你要使用fit,请这样:

    ...fit(train_generator, steps_per_epoch = len(train_generator), 
           epochs = 10, verbose = 1,
           validation_data = val_generator, validation_steps = len(val_generator))  
    

    最后,您应该在代码中寻找可能是None(如错误消息所示)的任何内容。

    • 检查每个函数是否都有return 行。
    • 检查__init__ 中生成器的所有输入。
    • 打印生成器中的文件名。
    • 获取生成器的__len__
    • 尝试从生成器中获取项目:x, y= train_generator[0]

    【讨论】:

    • 感谢您的回复。我做了你说的更改,错误仍然是一样的。 len 方法和 get_item 方法从未被调用过。抛出错误是因为它需要一个 Y 变量,而我的 y 变量设置为 None。
    • @JoãoCastilho,转到答案的第二部分(刷新页面并查看新的完整答案)
    • 我明白了,也许尝试像更新后的答案一样适合? (无批量)
    • 那是我无法想象的事情 :( --- 你是在把tensorflow.keras 和标准的keras 混在一起吗?--- 你可以试试from tensorflow.keras.utils import Sequence 吗?
    • 就是这样。非常感谢队友。我是从 tensorflow_core.python.keras.utils.data_utils 而不是 tensorflow.keras.utils 导入的。非常感谢,你是BOSS
    猜你喜欢
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 2021-09-18
    • 2020-10-14
    • 2023-03-30
    • 2022-06-22
    • 1970-01-01
    相关资源
    最近更新 更多