繁体   English   中英

自定义Keras生成器比Keras的bult生成器慢得多

Custom Keras generator much slower compared to Keras' bult in generator

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个多标签分类问题。 我写了这个自定义生成器。 它从磁盘读取图像和输出标签,并以32的大小批量返回它们。

def get_input(img_name):
    path = os.path.join("images", img_name)
    img = image.load_img(path, target_size=(224, 224))

    return img


def get_output(img_name, file_path):
    data = pd.read_csv(file_path, delim_whitespace=True, header=None)

    img_id = img_name.split(".")[0]
    img_id = img_id.lstrip("0")
    img_id = int(img_id)

    labels = data.loc[img_id - 1].values
    labels = labels[1:]

    labels = list(labels)
    label_arrays = []
    for i in range(20):
        val = np.zeros((1))
        val[0] = labels[i]
        label_arrays.append(val)

    return label_arrays


def preprocess_input(img_name):
    img = get_input(img_name)
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)    
    return x

def train_generator(batch_size):
    file_path = "train.txt"
    data = pd.read_csv(file_path, delim_whitespace=True, header=None)

    while True:
        for i in range(math.floor(8000/batch_size)):
            x_batch = np.zeros(shape=(32, 224, 224, 3))
            y_batch = np.zeros(shape=(32, 20))
            for j in range(batch_size):
                img_name = data.loc[i * batch_size + j].values
                img_name = img_name[0]
                x = preprocess_input(img_name)
                y = get_output(img_name, file_path)
                x_batch[j, :, :, :] = x
                y_batch[j] = y

            ys = []
            for i in range(20):
              ys.append(y_batch[:,i])

            yield(x_batch, ys)

标签返回模型有一个小问题,并在以下问题中得到解决: 训练多输出keras模型

我在单个输出问题上测试了此生成器。 此自定义生成器非常慢。 使用此自定义生成器的单个时间段的预计到达时间约为27小时,而内置生成器(使用flow_from_directory)单个时间段则需要25分钟。 我究竟做错了什么?

除使用的发电机外,两个测试的训练过程相同。 验证生成器类似于训练生成器。 我知道我无法达到Keras内置发电机的效率,但是这种速度差异太大。

编辑

我阅读了一些有关创建自定义生成器的指南。

编写定制的Keras生成器

fit_generator()的自定义生成器,生成具有不同形状的多个输入

1 个回复

也许内置的生成器会在您的gpu上处理数据,而您的自定义生成器则在cpu上运行,这会大大降低速度。

另一个猜测是因为Keras在后台使用数据集 您的实现可能使用feed-dict ,这是将信息传递给TensorFlow的最慢方法。 将数据输入模型的最好方法是使用输入管道,以确保GPU永远不必等待新的东西进入。

1 Keras:带有自定义生成器的badalloc

我在Ubuntu 17.04 VM上使用带有tensorflow-gpu后端的keras。 我创建了一个自定义生成器,以从泡菜文件中读取输入和类,但是似乎出现以下错误: 抛出'std :: ba d_alloc'what()实例后调用终止终止:std :: bad_alloc ...

2 为 Keras 编写自定义数据生成器

我将每个数据点存储在一个 .npy 文件中, shape=(1024,7,8) 。 我想将它们加载到通过类似的方式Keras模型ImageDataGenerator ,所以我写和尝试不同的自定义的发电机,但他们没有工作,这里是一个我改编自这 我发现这缺少标签,因此它不适合使用fit_genera ...

3 自定义Keras数据生成器,产量高

我正在尝试创建一个自定义数据生成器,但不知道如何在__getitem__方法内部集成yield函数和无限循环。 编辑 :答案后,我意识到我正在使用的代码是不需要yield语句的Sequence 。 目前,我正在使用return语句返回多个图像: class DataGenerato ...

4 如何编写高效的自定义 Keras 数据生成器

我想训练一个用于视频帧预测的卷积循环神经网络。 单个帧非常大,因此一次将整个训练数据放入内存中具有挑战性。 因此,我在网上学习了一些教程来创建自定义数据生成器。 测试时,它似乎可以工作,但与直接使用预加载数据相比,它至少慢了 100 倍。 由于我只能在 GPU 上容纳大约 8 的批量大小,我知道需要 ...

5 Keras自定义数据生成器非常慢

我正在使用Keras自定义数据生成器训练自动编码器。 数据足够大,无法容纳到内存中。 发电机: 模型fit_generator: Keras给出了2到3个小时的预计到达时间。 在没有定制生成器的情况下进行的测试仅需要少量的数据以适合内存,因此每个时期的ETA为20到30分钟。 关于PC ...

8 Keras:数据生成器

我看到了这段代码来使用keras生成器(*) 但是,当我运行“ __data_generation”时,python会在“ * self.dim”中抱怨星号,并显示消息“ SyntaxError:无效语法”。 您知道我是否应该使用“星号”吗? 如果删除它,并且仅使用“ se ...

9 Keras 评估生成器

我正在尝试使用自定义生成器(用于训练的相同生成器)评估 keras 分类器。 预测函数工作正常,但评估函数抛出 ValueError: Shapes (None, None, None) and (100, 4, 1, 200) is incompatible 什么可能导致这种情况? 它是同一个 ...

10 Keras 自定义生成器:类型错误:生成器需要 Float32

我使用的是自定义 Keras 数据生成器,代码如下: 这将生成一个 4-D 张量,以 2 通道图像作为训练数据(PET/CT 图像)和一个二进制掩码作为地面实况分割。 但是,当我尝试使用此生成器训练标准 U-Net 时,它可能会经过 10 批训练数据,然后才会出现此错误: 无效参数:Ty ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM