Запуск sklearn PCA для данных MNIST дает ошибку выделения памяти - PullRequest
1 голос
/ 21 июня 2020

Я пытаюсь запустить PCA для данных MNIST (просто возиться с ним, пытаясь изучить кое-что из ML), но получаю ошибку выделения памяти, которая кажется слишком маленькой для моей машины. Я пробовал два немного разных кода, следующий скопирован с этого веб-сайта: https://towardsdatascience.com/pca-using-python-scikit-learn-e653f8989e60, (где мне удалось запустить PCA в наборе данных Iris, абсолютно нормально).

Но когда Я go, чтобы запустить следующее:

from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784')

from sklearn.model_selection import train_test_split
# test_size: what proportion of original data is used for test set
train_img, test_img, train_lbl, test_lbl = train_test_split( mnist.data, mnist.target, test_size=1/7.0, random_state=0)


from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
# Fit on training set only.
scaler.fit(train_img)
# Apply transform to both the training set and the test set.
train_img = scaler.transform(train_img)
test_img = scaler.transform(test_img)


from sklearn.decomposition import PCA
# Make an instance of the Model
pca = PCA(.95)


pca.fit(train_img)

Я получаю сообщение об ошибке:

Traceback (most recent call last):
  File "C:\...\Python\pca_mnist_new.py", line 12, in <module>
    scaler.fit(train_img)
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\sklearn\preprocessing\_data.py", line 667, in fit
    return self.partial_fit(X, y)
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\sklearn\preprocessing\_data.py", line 762, in partial_fit
    _incremental_mean_and_var(X, self.mean_, self.var_,
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\sklearn\utils\extmath.py", line 765, in _incremental_mean_and_var
    new_sum = _safe_accumulator_op(np.nansum, X, axis=0)
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\sklearn\utils\extmath.py", line 711, in _safe_accumulator_op
    result = op(x, *args, **kwargs)
  File "<__array_function__ internals>", line 5, in nansum
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\numpy\lib\nanfunctions.py", line 649, in nansum
    a, mask = _replace_nan(a, 0)
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\numpy\lib\nanfunctions.py", line 109, in _replace_nan
    a = np.array(a, subok=True, copy=True)
MemoryError: Unable to allocate 359. MiB for an array with shape (60000, 784) and data type float64
[Finished in 29.868s]

(Я получаю аналогичную ошибку с немного другой преамбулой, когда я запускаю созданный мной код ранее с уже загруженными данными:

Traceback (most recent call last):
  File "C:\...\Python\pca_MNIST.py", line 36, in <module>
    pca.fit(x)
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\sklearn\decomposition\_pca.py", line 351, in fit
    self._fit(X)
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\sklearn\decomposition\_pca.py", line 423, in _fit
    return self._fit_full(X, n_components)
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\sklearn\decomposition\_pca.py", line 454, in _fit_full
    U, S, V = linalg.svd(X, full_matrices=False)
  File "C:\...\Local\Programs\Python\Python38-32\lib\site-packages\scipy\linalg\decomp_svd.py", line 128, in svd
    u, s, v, info = gesXd(a1, compute_uv=compute_uv, lwork=lwork,
MemoryError: Unable to allocate 359. MiB for an array with shape (60000, 784) and data type float64
[Finished in 2.792s]

, но у обоих одинаковая ошибка внизу.)

Я использую Windows 10, выполняю этот код в Atom, но я получить ту же ошибку, запустив это из командной строки, когда все остальное закрыто. У меня 16 ГБ оперативной памяти.

Я понимаю, что MiB - это Mebibyte, и 359 из них кажутся слишком маленькими для ошибки распределения с 16 ГБ оперативной памяти, но именно здесь мой ограниченный опыт и разочарование в поиске в Google оставляют меня в затруднительном положении. потеря.

Из этого я вижу: { ссылка }: ~: text = Python% 20действует% 20limit% 20memory, что% 20вы% 20выглядит на% 20. , это Python просто выделяет столько памяти, сколько может, пока не останется ни одной.

Возможно ли, что функция PCA использует всю эту память, и эта ошибка просто для массива, который сломал спину верблюда? Моя интуиция говорит «нет», но я действительно не в своей тарелке.

Есть ли способ заставить это работать, чтобы я мог go поиграть с некоторыми данными более низкого измерения? Или мне придется сделать объезд и написать что-нибудь, чтобы сделать это вручную?

1 Ответ

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

Простой обходной путь, который вы обязательно должны попробовать, - это уменьшить точность с плавающей запятой. float64 кажется чрезмерным, даже нейронные сети не используют такую ​​точность.

import numpy as np

train_img = train_img.astype(np.float32)  # or even np.float16

Попробуйте это и для test_img.

...