在keras中调用to_categorical时出现MemoryError

时间:2018-09-26 22:24:41

标签: python numpy memory keras cross-entropy

我尝试运行语言建模程序。当我在文档中使用包含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 :(得分:0)

我认为这是预期的错误。真正的问题是您没有足够的空间来分配1)决策层的参数矩阵,和/或2)中间张量。

参数矩阵的形状为input_feat_dim x output_num_classes。如您所见,词汇量很大时,此矩阵将消耗大量内存。 要训​​练网络,我们还需要为BP保留中间张量,该张量会更大-batch_size x input_feat_dim x output_num_classes

因此,您可以快速尝试做的一件事就是将batch_size减少到1/10。当然,您不能将批次大小设置得太小。在这种情况下,您可能需要累积梯度,直到看到足够的样本为止。

答案 1 :(得分:0)

如果您切换到稀疏的分类交叉熵损失,则无需to_categorical调用,这实际上是一个错误。稀疏的分类交叉熵应该可以解决这个问题。