我尝试运行语言建模程序。当我在文档中使用包含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
。我已经做到了,但是使用相同的回溯仍然是错误的。
谢谢
答案 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
调用,这实际上是一个错误。稀疏的分类交叉熵应该可以解决这个问题。