Как реализовать масштабирование в пользовательском DataGenerator?

Я создал пользовательский DataGeneratorby, используя tf.keras.utils.Sequence :( https://www.tensorflow.org/api_docs/python/tf/keras/utils/Sequence). Это настроенный DataGenerator:

# Here, `x_set` is list of path to the images
# and `y_set` are the associated classes.

class DataGenerator(Sequence):

    def __init__(self, x_set, y_set, batch_size):
        self.x, self.y = x_set, y_set
        self.batch_size = batch_size

    def __len__(self):
        return math.ceil(len(self.x) / self.batch_size)

    def __getitem__(self, idx):
        batch_x = self.x[idx * self.batch_size:(idx + 1) *
        self.batch_size]
        batch_x = np.array(batch_x)
        batch_x = batch_x*1/255
        batch_y = self.y[idx * self.batch_size:(idx + 1) *
        self.batch_size]

        return np.array([
            resize(imread(file_name), (64, 128))
               for file_name in batch_x]), np.array(batch_y)

x_set - это список путей к моим изображениям, а y_set - это связанные классы. Теперь я хотел бы добавить функцию для изменения масштаба каждого пикселя изображения путем умножения его на rescale = 1./255, как в классе ImageDataGenerator: https://keras.io/api/preprocessing/image/#ImageDataGenerator%20class

Когда я применяю этот код с model.fit_generator:

model.fit_generator(generator=training_generator,
                    validation_data=validation_generator,
                    steps_per_epoch = num_train_samples // 128,
                    validation_steps = num_val_samples // 128,
                    epochs = 10)

Я получаю такую ​​ошибку:

---------------------------------------------------------------------------
UFuncTypeError                            Traceback (most recent call last)
<ipython-input-62-571a868b2d2a> in <module>()
      3                     steps_per_epoch = num_train_samples // 128,
      4                     validation_steps = num_val_samples // 128,
----> 5                     epochs = 10)

8 frames
<ipython-input-54-d98c3b0c7c56> in __getitem__(self, idx)
     15         self.batch_size]
     16         batch_x = np.array(batch_x)
---> 17         batch_x = batch_x*1/255
     18         batch_y = self.y[idx * self.batch_size:(idx + 1) *
     19         self.batch_size]

UFuncTypeError: ufunc 'multiply' did not contain a loop with signature matching types (dtype('<U77'), dtype('<U77')) -> dtype('<U77')

Как мне изменить свой код?


person Tobitor    schedule 29.06.2020    source источник
comment
batch_x * 1./255?   -  person Marco Cerliani    schedule 29.06.2020
comment
Где мне реализовать этот код?   -  person Tobitor    schedule 29.06.2020
comment
где вы определяете batch_x или в строке ниже batch_x = batch_x * 1/255   -  person Marco Cerliani    schedule 29.06.2020
comment
Тогда я получаю: TypeError: unsupported operand type(s) for /: 'list' and 'int'   -  person Tobitor    schedule 29.06.2020
comment
для этого batch_x должен быть массивом   -  person Marco Cerliani    schedule 29.06.2020
comment
Я отредактировал свой вопрос. Я не получаю _1 _...   -  person Tobitor    schedule 29.06.2020
comment
обратите внимание, где вы применяете imread ... вы должны прочитать (чтобы иметь массив), прежде чем применять масштабирование   -  person Marco Cerliani    schedule 29.06.2020
comment
Извините, я новичок в программировании, и, подумав об этом, я не понимаю ...   -  person Tobitor    schedule 29.06.2020
comment
так без масштабирования ваш генератор работает? верный?   -  person Marco Cerliani    schedule 29.06.2020
comment
Да все верно.   -  person Tobitor    schedule 29.06.2020


Ответы (1)


попробуй таким образом

class DataGenerator(Sequence):

    def __init__(self, x_set, y_set, batch_size):
        self.x, self.y = x_set, y_set
        self.batch_size = batch_size

    def __len__(self):
        return math.ceil(len(self.x) / self.batch_size)

    def __getitem__(self, idx):
        batch_x = self.x[idx*self.batch_size : (idx + 1)*self.batch_size]
        batch_x = np.array([resize(imread(file_name), (64, 128)) for file_name in batch_x])
        batch_x = batch_x * 1./255
        batch_y = self.y[idx*self.batch_size : (idx + 1)*self.batch_size]
        batch_y = np.array(batch_y)

        return batch_x, batch_y
person Marco Cerliani    schedule 29.06.2020
comment
Большое спасибо! Оно работает. Однако это очень медленно, и я не знаю. Но раньше это было медленно ... stackoverflow.com/questions/62612518/ - person Tobitor; 29.06.2020