gpt4 book ai didi

python - 具有产量的自定义 Keras 数据生成器

转载 作者:行者123 更新时间:2023-12-02 05:27:06 25 4
gpt4 key购买 nike

我正在尝试创建一个自定义数据生成器,但不知道如何将 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

在此article我看到 yield 用于无限循环。我不太明白那个语法。循环是如何逃逸的?

最佳答案

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

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

所以你正在以正确的方式做事,不需要改变。

关于python - 具有产量的自定义 Keras 数据生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56079223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com