массивы memmap для pytorch и накопления градиентов

#tensorflow #pytorch #dataset #numpy-memmap #batchsize

Вопрос:

У меня есть Большой набор данных (> 62 ГиБ) после обработки , сохраненный в виде двух массивов NumPy.memmap, один из которых содержит данные, а другой-метки.Набор данных имеет следующие формы (7390,60,224,224,3) и (7390), и он >НЕ перетасован, поэтому сначала его нужно перетасовать.

теперь я использую tensorflow2 и использовал этот код с моим генератором для управления массивами memmap раньше

 def my_generator():
    for i in range(len(numpy_array)):
          yield numpy_array[i,:,:,:,:],np.array(labels[i]).reshape(1)

full_dataset = tf.data.Dataset.from_generator(
    generator=my_generator,
    output_types=(np.uint8,np.int32),
    output_shapes=((60,224,224,3),(1))
)

full_dataset = full_dataset.shuffle(SHUFFLE_BUFFER_SIZE, reshuffle_each_iteration=False)
train_dataset = full_dataset.take(train_size)
test_dataset = full_dataset.skip(train_size)
val_dataset = test_dataset.skip(test_size)
test_dataset = test_dataset.take(test_size) 
 

Таким образом, я могу тренироваться без загрузки в память всего набора данных с перетасовкой и пакетированием.

Теперь с этой текущей моделью и набором данных видеопамяти недостаточно для загрузки более 2 пакетов в виде тензоров. и я не могу тренироваться с размером пакета 2.

я думал о накоплении градиентов, но я не мог этого сделать с TF2, и я нашел это легко с помощью pytorch, но я не могу найти, как работать с массивами memmap с перемешиванием и разделением, как в tensorflow с генераторами.

поэтому мне нужно знать, как загрузить набор данных из pytorch с тем же перетасовыванием и порционированием в pytorch.

Или если у кого-то есть готовый код для GA на TF2

Комментарии:

1. В этом посте есть несколько вопросов, пожалуйста, разделите их на разные вопросы.

Ответ №1:

Я просто рассмотрю вопрос о перетасовке.

Вместо того, чтобы перетасовывать данные tf.Набор данных, сделайте это на уровне генератора. Это должно сработать:

 class Generator(object):
    def __init__(self, images, labels, batch_size):
        self.images = images
        self.labels = labels
        self.batch_size  = batch_size
        self.idxs = np.arange(len(self.images))
        self.on_epoch_end()

    def on_epoch_end(self):
        # Shuffle the indices
        np.random.shuffle(self.idxs)

    def generator(self):
        i = 0
        while i < len(self.idxs):
            idx = self.idxs[i]
            yield (self.images[idx], self.labels[i])
            i  = 1
        self.on_epoch_end()

    def batch_generator(self):
        it = iter(self.generator)
        while True:
            vals = [next(it) for i in range(self.batch_size)]
            images, labels = zip(*vals)
            yield images, labels
 

Тогда вы можете использовать его с помощью

 gen = Generator(...)
it = iter(gen)

batch = next(it)  # Call this every time you want a new batch
 

Я уверен, что у pytorch есть встроенные методы для такого рода вещей, хотя