如何解决keras上的错误“分配的系统内存超过10”?

时间:2019-01-11 06:52:30

标签: python-3.x memory keras conv-neural-network

我在带有Tensorflow后端的Keras上制作了CNN,我的训练集有144个示例,但每个示例的大小为3200 * 101。我的CNN非常简单,仅用于学习,batch_size为2(我尝试将其从32减小,但没有任何改善)。一层CNN层,一层扁平层和一层致密层用于输出(11类)。当我拟合模型时,mi笔记本电脑会显示“(大量)分配超过系统内存的10”,然后冻结它,即使没有运行1个历元。我无法“压缩”示例,每个示例都必须具有正确的大小。我在CPU(我没有GPU),8 GB内存,1 TB磁盘上运行模型。我该怎么办?

Psdt:对不起,英语不好,我还在学习。并感谢您的回答!

更新-编辑:仅添加更多信息。

例如,我的火车组的形状为(144,3400,101,1),标签的形状为(144,11) 我的模型是这样的:

model.add(Conv2D(8, kernel_size=6, activation='linear', input_shape=(3400,101,1), batch_size=2))
model.add(Flatten())
model.add(Dense(11, activation='softmax'))
model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=100)

2 个答案:

答案 0 :(得分:0)

在Keras的纯前馈网络中使用非常长的输入编码时,这看起来也像我遇到的相同错误。我一直在使用单词嵌入,没有问题,但是现在我在输入中添加了额外的功能,并且遇到了与您相同的错误。 您需要启用更多的内存以供脚本使用。 在kubernetes中对我有用的是增加pod的yml文件中的内存:

spec:
  containers:
  - name: yourname
    image: yourimage
    command: yourcommand
    args: yourargs
    resources:
      limits:
         nvidia.com/gpu: 1 # requesting 1 GPU
         memory: 100Gi

最初是8G,在我介绍其他功能之前就可以使用。 如果您不使用docker和K8s,则可以在tensorflow会话中执行以下操作: config.gpu_options.allow_growth = True

在Keras中,我认为应该是:

import tensorflow as tf
from keras import backend as K
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
config.log_device_placement = True
session = tf.Session(config=config)
K.set_session(session)
# do your ML task
K.get_session().close();

batch_size减小为1可能会解决问题。 通常,此错误只是警告,即使作业死机,如果您让它继续运行,它也可能完成。如果这项工作被取消了(就像我的一样),那么您肯定需要为其提供更多的内存,GPU服务器可能是比您的笔记本电脑更好的主意。您还可以确保使用的是float32,而不是float64,因为这样会占用两倍的内存。另外,据我所知,通常在Adam优化器中会出现此错误,因此您正在使用SGD的事实意味着问题可能不在优化过程中。

答案 1 :(得分:-1)

sudo swapoff /swapfile
sudo rm  /swapfile
sudo fallocate -l 16G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

swapon -s

以上步骤制作16G交换空间。然后运行您的深度学习代码。

我的笔记本电脑规格是 HP 430 g2 4G 内存 + 500 G SSD