Как использовать файл numpy без импорта в оперативную память? - PullRequest
1 голос
/ 21 июня 2020

Я хочу использовать файл numpy (.npy) с Google Диска в Google Colab, не импортируя его в ОЗУ.

Я работаю над классификацией изображений и храню данные моего изображения в четырех numpy файлы на Google Диске. Общий размер файлов превышает 14 ГБ. В то время как Google Colab предлагает для использования только 12 ГБ ОЗУ. Есть ли способ, которым я могу его использовать, загружая только одну партию в плунжер для обучения модели и удаляя ее с плунжера (возможно, аналогично flow_from_directory)?

Проблема с использованием flow_from_directory заключается в том, что это очень медленно даже для одного блока VGG16, даже если у меня есть изображения в каталоге Colab.

Я использую набор данных Cats vs Dogs Classifier от Kaggle.

! kaggle competitions download -c 'dogs-vs-cats'

Я преобразовал данные изображения в массив numpy и сохранил его в 4 файлах:

X_train - float32 - 10,62 ГБ - (18941, 224, 224, 3)

X_test - float32 - 3,4 ГБ - (6059 , 224, 224, 3)

Y_train - float64 - 148 КБ - (18941)

Y_test - float64 - 47 КБ - (6059)

Когда я запускаю следующий код, сеанс аварийно завершается с отображением «Сбой сеанса после использования всей доступной оперативной памяти». ошибка.

import numpy as np
X_train = np.load('Cat_Dog_Classifier/X_train.npy')
Y_train = np.load('Cat_Dog_Classifier/Y_train.npy')
X_test = np.load('Cat_Dog_Classifier/X_test.npy')
Y_test = np.load('Cat_Dog_Classifier/Y_test.npy')

Есть ли способ использовать эти 4 файла, не загружая их в ОЗУ?

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Вы можете сделать это, открыв файл как массив с отображением в память .

Например:

import sys
import numpy as np

# Create a npy file
x = np.random.rand(1000, 1000)
np.save('mydata.npy', x)

# Load as a normal array
y = np.load('mydata.npy')
sys.getsizeof(y)
# 8000112

# Load as a memory-mapped array
y = np.load('mydata.npy', mmap_mode='r')
sys.getsizeof(y)
# 136

Второй массив действует как обычный массив , но поддерживается диском, а не ОЗУ. Имейте в виду, что это приведет к тому, что операции с массивами будут намного медленнее, чем с обычными массивами с поддержкой RAM; Часто mem-mapping используется для удобного доступа к частям массива без необходимости загружать весь массив в RAM.

0 голосов
/ 21 июня 2020

Общий размер файлов составляет 14 ГБ, что на самом деле больше, чем 12 ГБ, которые, по вашему мнению, у вас есть. Однако вы создали эти файлы из данных, которые также были в памяти, как и в более ранней версии вашего вопроса, которая предполагает, что памяти достаточно для хранения всех данных:

save('drive/My Drive/ML/Cats_vs_Dogs_Classifier/X_train.npy', X_train)
save('drive/My Drive/ML/Cats_vs_Dogs_Classifier/Y_train.npy', Y_train)
save('drive/My Drive/ML/Cats_vs_Dogs_Classifier/X_test.npy', X_test)
save('drive/My Drive/ML/Cats_vs_Dogs_Classifier/Y_test.npy', Y_test)

Однако, если вы попытайтесь снова загрузить файл X_train в том же сеансе Python (я предполагаю, что вы используете Jupyter Notebook), вам временно понадобится еще 10,6 ГБ памяти, прежде чем будут освобождены 10,6 ГБ, занятые предыдущим X_train .

Вы можете выбрать одну из следующих стратегий:

  • Запустить новый Python процесс (или ядро) перед загрузкой данных.
  • Явное освобождение памяти перед продолжением:
    del X_train, Y_train, X_test, Y_test
    
  • Поместите код, который генерирует данные, внутри функции. Все локальные переменные, созданные в функции, будут автоматически удалены, когда функция вернется.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...