Чтение случайных элементов в файле .h5 без загрузки всей матрицы - PullRequest
0 голосов
/ 11 марта 2019

У меня есть гигантский тренировочный набор данных, который не помещается в ОЗУ.Я попытался загрузить случайную партию изображений в стек без загрузки всего .h5.Мой подход состоял в том, чтобы создать список индексов и перетасовать их, а не перетасовывать весь файл .h5.Допустим:

a = np.arange(2000*2000*2000).reshape(2000, 2000, 2000)
idx = np.random.randint(2000, size = 800) #so that I only need to shuffle this idx at the end of epoch

# create this huge data 32GBs > my RAM
with h5py.File('./tmp.h5', 'w') as f:
     tmp = f.create_dataset('a', (2000, 2000, 2000))
     tmp[:] = a

# read it
with h5py.File('./tmp.h5', 'r') as f:
     tensor = f['a'][:][idx] #if I don't do [:] there will be error if I do so it will load whole file which I don't want

У кого-нибудь есть решение?

1 Ответ

0 голосов
/ 04 апреля 2019

Благодаря @ max9111, вот как я предлагаю решить эту проблему:

batch_size = 100 
idx = np.arange(2000)
# shuffle
idx = np.random.shuffle(idx)

Из-за ограничения в h5py :

Координаты выбора должны быть даны в порядке возрастания

Перед прочтением нужно разобраться:

for step in range(epoch_len // batch_size):
     try:
          with h5py.File(path, 'r') as f:
               return f['img'][np.sort(idx[step * batch_size])], f['label'][np.sort(idx[step * batch_size])]
     except:
          raise('epoch finished and drop the remainder')
...