Понимание пользовательского генератора данных для целей обучения

#python #keras #generator #yield

Вопрос:

Я пытаюсь понять, как imagedatagenerator получает изображения из каталога и передает их на обучение. например.

 import os
import numpy 
import cv2
class image_gen():
    def __init__(self, sdir, batch_size, shuffle):          
        self.batch_index=0  
        self.sdir=sdir # directory containing input images
        self.batch_size=batch_size   #batch size is number of samples in a batch
          # tuple (width, height)  for target image 
        self.shuffle=shuffle   # set to True to shuffle images, False for no shuffle
         # initialize list to hold sequential list of total labels generated
        self.image_list=[] # initialize list to hold sequential list of total images filenames generated
        self.s_list=os.listdir(self.sdir)   # list of images in directory      
        
    def get_images(self):    # gets a batch of input images, resizes input image to make target images        
        input_image_batch=[] # initialize list to hold a batch of target images
         # initialize list to hold batches of  input images 
        sample_count=len(self.s_list)  # determine total number of images available         
        for i in range(self.batch_index * self.batch_size, (self.batch_index   1) * self.batch_size  ): #iterate for  a batch
            j=i % sample_count # cycle j value over range of available  images
            k=j % self.batch_size  # cycle k value over batch size
            if self.shuffle: # if shuffle select a random integer between 0 and sample_count-1 to pick as the image=label pair
                m=np.random.randint(low=0, high=sample_count-1, size=None, dtype=int) 
            else:
                m=j   # no shuffle         
            path_to_img=os.path.join(self.sdir, self.s_list[m]) # define the path to the m th image 
            input_image=cv2.imread(path_to_img)
            
             #create the target image from the input image            
            input_image_batch.append(input_image)        
        input_image_array=numpy.array((input_image_batch), dtype = "object")
        
        self.batch_index=self.batch_index   1         
        yield (input_image_array) 
 

Так я это называю

 batch_size=5
sdir=r"D:\Input" # set this to your image directory
shuffle=True
gen=image_gen(sdir, batch_size,shuffle) # instantiate an instance of the class
input_images=next(gen.get_images()) # get a batch of inputs
 

Тренируя его

 model.fit(input_images,output_images,validation_data = (X_val,y_val),batch_size= 5,epochs = 100)
 

Каждый раз,когда я вызываю функцию, она выдает мне пакет (который я выбираю, здесь его 5) изображений. Теперь я пытаюсь понять, что такое модель воли.следует продолжать вызывать функцию, чтобы получить следующую партию изображений, или я должен передать цикл в функции, чтобы продолжать получать изображения из каталога. Если я сделаю цикл while в функции, это не приведет к перегрузке памяти, потому что там будут все файлы из каталога.Или, проще говоря, работает ли приведенный выше код как генератор изображений данных