oez*_*nsi 6 python yield keras tensorflow
我正在尝试创建一个自定义数据生成器,但不知道如何将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
Run Code Online (Sandbox Code Playgroud)
在这篇文章中,我看到它yield在无限循环中使用。我不太明白那个语法。循环是如何转义的?
Mat*_*gro 12
您正在使用 Sequence API,它的工作方式与普通生成器略有不同。在生成器函数中,您将使用yield关键字在循环内执行迭代while True:,因此每次 Keras 调用生成器时,它都会获取一批数据并自动环绕数据的末尾。
但是在 Sequence 中,函数有一个index参数__getitem__,因此不需要迭代或yield不需要,这是由 Keras 为您执行的。这样做是为了使序列可以使用多处理并行运行,这在旧的生成器函数中是不可能的。
所以你正在以正确的方式做事,不需要改变。
生成器示例Keras:
def datagenerator(images, labels, batchsize, mode="train"):
while True:
start = 0
end = batchsize
while start < len(images):
# load your images from numpy arrays or read from directory
x = images[start:end]
y = labels[start:end]
yield x, y
start += batchsize
end += batchsize
Run Code Online (Sandbox Code Playgroud)
Keras 希望您在生成器中运行无限循环。
如果您想了解 Python 生成器,那么评论中的链接实际上是一个不错的起点。
| 归档时间: |
|
| 查看次数: |
6794 次 |
| 最近记录: |