Смешной размер памяти для массива данных

#python-3.x #numpy #dataset #tensorflow2.0

#python-3.x #numpy #набор данных #tensorflow2.0

Вопрос:

 try: 
    with open(f'F:/Storage/readyDataset{IMG_SIZE}.pkl', 'rb') as save:
        training_data = pickle.load(save)
    print("Using dataset")
except:
    for category in CATEGORIES:
        path = os.path.join(DATADIR, category)
        class_num = CATEGORIES.index(category)
        print("Gathering Dataset: {}%".format(class_num*50))
        for img in os.listdir(path):
            img_array = cv2.imread(os.path.join(path,img))
            new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
            training_data.append([new_array, class_num])
    print("Gathering Dataset: 100%nSaving dataset")
    with open(f'F:/Storage/readyDataset{IMG_SIZE}.pkl', 'wb') as save:
        pickle.dump(training_data, save, protocol=4)

print("Compiling Data")
random.shuffle(training_data)
for features, label in training_data:
    X.append(features)
    Y.append(label)
X = np.array(X).reshape(-1, IMG_SIZE, IMG_SIZE, 3) / 255
Y = np.array(Y)
print("Finished Compiling Data")
  

Ошибка памяти: невозможно выделить 39,8 гигабайт для массива с формой (6800, 512, 512, 3) и типом данных float64

В настоящее время я пытаюсь использовать пользовательский набор данных из 6800 изображений в TensorFlow v2. Размер набора данных составляет менее 3 ГБ, но после компиляции данных он указывает, что его 40 ГБ. Как это возможно? Я чувствую, что делаю это неправильно.

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

1. Дайте форму массива, это ожидаемый диапазон размеров, (6800* 512* 512* 3 *8)/1e9 . Как вы измеряете размер набора данных?

2. Возможно, вы забыли умножить на размер числа с плавающей точкой? Или 3 канала?

3. @hpaulj Его 512 пикселей на 512 пикселей, а 3 — RGB, я не уверен, зачем вам добавлять 8? также, что делает /1e9 ?

4. @MadPhysicist Я не уверен, что вы имеете в виду, умножая размер числа с плавающей запятой, 3 должно представлять RGB правильно?

5. @Poofy38. Ваши данные загружаются в массив с типом данных np.float64 в соответствии с сообщением об ошибке. float64 это 64-разрядное или 8-байтовое число. Это то, о чем я говорю, и именно отсюда происходит коэффициент hpaulj, равный 8.

Ответ №1:

Вы можете использовать tf.data.Dataset для создания своего набора данных для оптимизации потребления памяти.
Для входных конвейеров TensorFlow с данными другого типа вы можете следовать этой официальной документации .