Выдача данных генератора в пакетном режиме при чтении файлов с диска накапливается в памяти, как при загрузке целых данных. - PullRequest
0 голосов
/ 08 ноября 2019

Я использую keras для обучения моего Inception-Resnet для моих данных МРТ. Данные распределены по 151 файлам, и каждый файл соответствует пациенту (я не могу накапливать данные в один, поскольку имена файлов являются идентификаторами для пациента, которые предоставляют метки). Данные слишком велики, чтобы уместиться в моей памяти (больше 25 ГБ). Поэтому я использовал keras.fit_generator . Я пытаюсь прочитать файлы (равные по количеству batch_size) и выполнить некоторую обработку для них, а затем получить эти данные и повторить. Проблема здесь в том, что когда я использую генератор и наблюдаю свою ОЗУ при каждом следующем (данные), использование ОЗУ увеличивается каждый раз вместо того, чтобы оставаться одинаковым или почти одинаковым (так как размеры файлов почти одинаковы), что в некоторых 88 файлах приводит к сбою моего кода. Что мне не хватает? Я много пробовал. Вот мой код генератора:

def file_reading(datafiles, batch_size, labels, d_type, N):

  while True:
    batch_data = []
    batch_label = []
    batch_start = 0
    batch_end = batch_size
    label = -1
    i=0

    while (batch_end<=N):
      for path in datafiles[batch_start:batch_end] :
        id = int(path.split('/')[-1].split('.')[0].lstrip("0"))
        if id in labels:
          dlabel_of_id = labels[id][d_type]
        else:
          pass
        if (dlabel_of_id != 'na'):
          if (dlabel_of_id == 'yes'):
            label = 1
          elif (dlabel_of_id == 'no'):
            label = 0
          raw = mne.io.read_raw_edf(path, preload=True);
          if max(raw.times) < 660:
            raw.crop(tmin=60, tmax=max(raw.times));
          else:
            raw.crop(tmin=60, tmax=660);
          temp = montages(raw)
          raw = 0
          temp = np.resize(temp,(2966,2966,3))
          batch_data.append(temp)
          batch_label.append(label)
      yield (batch_data, batch_label)
      batch_start += batch_size
      batch_end += batch_size

Более того, когда я делаю это

data = file_reading(paths, 16, labels, 'EEG', 151)
len(next(data)[0])

Тогда память не накапливается и генератор работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...