MemoryError при вызове to_categorical в керасе - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь запустить программу языкового моделирования.Когда я использую последовательность данных с 15000 предложениями в документе, программа работает правильно.Но, когда я пытаюсь изменить данные на более крупные (в 10 раз больше), возникает ошибка, как показано ниже:

Traceback (most recent call last):

  File "<ipython-input-2-aa5ef9098286>", line 1, in <module>
    runfile('C:/Users/cerdas/Documents/Bil/Lat/lstm-plato-lm/platolm.py', wdir='C:/Users/cerdas/Documents/Bil/Lat/lstm-plato-lm')

  File "C:\Users\cerdas\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)

  File "C:\Users\cerdas\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/cerdas/Documents/Bil/Lat/lstm-plato-lm/platolm.py", line 35, in <module>
    y = to_categorical(y, num_classes=vocab_size)

  File "C:\Users\cerdas\Anaconda3\lib\site-packages\keras\utils\np_utils.py", line 30, in to_categorical
    categorical = np.zeros((n, num_classes), dtype=np.float32)

MemoryError

вот предполагаемая строка кода ошибки:

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

, а также np.utils

categorical = np.zeros((n, num_classes), dtype=np.float64)

Я пытаюсь найти решение для аналогичной проблемы, я обнаружил, что мне нужно изменить categorical_crossentropy на sparse_categorical_crossentropy.Я сделал это, но это все еще ошибка с той же трассировкой.

Спасибо

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Если вы переключитесь на разреженную категориальную кросс-энтропийную потерю, тогда вам не нужно to_categorical вызывать, что на самом деле и дает ошибку.Для этого должна работать разреженная категориальная кросс-энтропия.

0 голосов
/ 27 сентября 2018

Я думаю, что эта ошибка ожидается.Реальная проблема заключается в том, что у вас недостаточно места для выделения 1) матрицы параметров уровня принятия решений и / или 2) промежуточного тензора.

Матрица параметров имеет форму input_feat_dim x output_num_classes,Как видите, эта матрица будет занимать огромное количество памяти при большом словарном запасе.Для обучения сети нам также нужно сохранить промежуточные тензоры для BP, которые будут еще больше - batch_size x input_feat_dim x output_num_classes.

Итак, одна вещь, которую вы можете попробовать очень быстро, - это уменьшить batch_size до 1/10.Конечно, вы не можете установить слишком маленький размер пакета.В этом случае вы можете накапливать градиенты, пока не увидите достаточно образцов.

...