当前位置: 首页 > 面试题库 >

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

马野
2023-03-14
问题内容

我正在尝试创建一个自定义数据生成器,但不知道如何yield__getitem__方法内部将函数与无限循环结合在一起。

编辑 :答案后,我意识到我正在使用的代码是Sequence不需要yield声明的。

目前,我正在返回多张图片,并附上一条return声明:

class DataGenerator(tensorflow.keras.utils.Sequence):
    def __init__(self, files, labels, batch_size=32, shuffle=True, random_state=42):
        'Initialization'
        self.files = files
        self.labels = labels
        self.batch_size = batch_size
        self.shuffle = shuffle
        self.random_state = random_state
        self.on_epoch_end()

    def __len__(self):
        return int(np.floor(len(self.files) / self.batch_size))

    def __getitem__(self, index):
        # Generate indexes of the batch
        indexes = self.indexes[index * self.batch_size:(index + 1) * self.batch_size]

        files_batch = [self.files[k] for k in indexes]
        y = [self.labels[k] for k in indexes]

        # Generate data
        x = self.__data_generation(files_batch)

        return x, y

    def on_epoch_end(self):
        'Updates indexes after each epoch'
        self.indexes = np.arange(len(self.files))
        if self.shuffle == True:
            np.random.seed(self.random_state)
            np.random.shuffle(self.indexes)


    def __data_generation(self, files):
        imgs = []

        for img_file in files:

            img = cv2.imread(img_file, -1)

            ###############
            # Augment image
            ###############

            imgs.append(img)

        return imgs

在本文中,我看到了yield它在无限循环中使用的情况。我不太了解这种语法。循环如何逃逸?


问题答案:

您正在使用Sequence API,该API与普通生成器的工作原理有所不同。在生成器函数中,您将使用yield关键字在循环内执行迭代while True:,因此,每次Keras调用生成器时,它都会获取一批数据,并自动环绕数据的末尾。

但是在序列中,函数有一个index参数__getitem__,因此不需要迭代或不需要迭代yield,这由Keras为您执行。这样可以使序列可以使用多重处理并行运行,而这对于旧的生成器函数是不可能的。

因此,您以正确的方式行事,无需任何更改。



 类似资料:
  • 我有一个自定义文件,其中包含我所有图像的路径及其标签,我在一个数据框中加载使用: MyIndex有两列感兴趣的ImagePath和ClassName 接下来我做一些训练测试拆分和编码输出标签为: 我面临的问题是一次性加载的数据太大,无法放入当前的机器内存,因此我无法处理完整的数据集。 我曾尝试使用datagenerator,但不想遵循它遵循的目录约定,也无法消除增强部分。 问题是,是否有一种方法可

  • 我使用的是SpringBoot(1.4)、SpringData和jpa。使用我的表/实体之一的ID列(crudepository),我想生成自定义字符串。从一些特定的字符串加上创建数据和时间开始,以db中的下一个值结束。所以这里我不能使用,我需要一些本地查询,比如“selectnextvalue” 有没有更好的方法可以做到这一点。

  • 是否有方法重写build方法返回SampleClass以避免执行build.build?

  • 我有一个NN,它有两个相同的CNN(类似于暹罗网络),然后合并输出,并打算在合并的输出上应用自定义损失函数,如下所示: 在我的自定义损失函数中,我需要将y垂直分解为两块,然后对每一块应用分类交叉熵损失。但是,我不断从我的损失函数得到dtype错误,例如: ()中的ValueError回溯(最近一次调用)---- /usr/local/lib/python3。5/地区包/KERA/发动机/培训。编译

  • 我试图在Keras中构造一个自定义损失函数-这是用于生存分析中的删失数据。 这种损失函数本质上是二元交叉熵,即多标签分类,但是损失函数中的求和项需要根据Y_true标签的可用性而变化。见下面的例子: 示例1:Y_可用的所有标签均为True Y_true=[0,0,0,1,1] Y_pred=[0.1,0.2,0.2,0.8,0.7] 损失=-1/5(log(0.9)log(0.8)log(0.8)

  • 本文向大家介绍pytorch Dataset,DataLoader产生自定义的训练数据案例,包括了pytorch Dataset,DataLoader产生自定义的训练数据案例的使用技巧和注意事项,需要的朋友参考一下 1. torch.utils.data.Dataset datasets这是一个pytorch定义的dataset的源码集合。下面是一个自定义Datasets的基本框架,初始化放在__

  • 我希望向sbt添加一个自定义源生成器,并将其与scalapb(Scala协议缓冲区生成器)一起使用。每一个都独立工作。然而,当两者结合在一起时,项目在清理后第一次编译失败。如果我再次运行compile,它就会成功。 错误消息: 要再现此错误,您需要在src/main/protobuf中至少有一个proto文件。 我的自定义任务和scalapb这两个源生成器会发生冲突,这让我感到困惑。它们不应该都写

  • 我正在尝试使用Keras创建自定义损失函数。我想根据输入计算损失函数并预测神经网络的输出。 我尝试在Keras中使用自定义loss函数。我认为y_true是我们为训练提供的输出,y_pred是神经网络的预测输出。下面的损失函数与 Keras 中的“mean_squared_error”损失相同。 我想使用神经网络的输入也计算自定义损失函数除了mean_squared_error损失。有没有办法将输