使用Keras卷积网络的内存问题

时间:2017-06-15 14:18:26

标签: python memory computer-vision keras convolution

我对使用大数据的ML非常陌生,之前我曾使用Keras通用卷积示例进行狗/猫分类,但是当我对我的图像集应用类似的方法时,我遇到了内存问题。

我的数据集由非常长的图像组成,大小为10048 x1687像素。为了避免内存问题,我使用批量大小为1,一次向模型提供一个图像。

该模型有两个卷积层,每个卷后面都有最大池,这些层在完全连接层之前一起使扁平层大约有290,000个输入。

然后,在运行后,内存使用率会立即达到极限(8Gb)。

所以我的问题如下:

1)在本地Python处理这种大小的计算的最佳方法是什么(没有云利用率)?我需要使用其他python库吗?

2 个答案:

答案 0 :(得分:2)

查看python中yield的内容以及生成器的概念。您不需要在开头加载所有数据。您应该使batch_size足够小,以免出现内存错误。 您的生成器可能如下所示:

def generator(fileobj, labels, memory_one_pic=1024, batch_size): 
  start = 0
  end = start + batch_size
  while True:
     X_batch = fileobj.read(memory_one_pic*batch_size)
     y_batch = labels[start:end]
     start += batch_size
     end += batch_size
     if not X_batch:
        break
     if start >= amount_of_datasets:
       start = 0
       end = batch_size
     yield (X_batch, y_batch)

......稍后您已准备好架构......

train_generator = generator(open('traindata.csv','rb'), labels, batch_size)
train_steps = amount_of_datasets//batch_size + 1

model.fit_generator(generator=train_generator,
                     steps_per_epoch=train_steps,
                     epochs=epochs)

您还应该阅读batch_normalization,这基本上有助于更快地学习并提高准确性。

答案 1 :(得分:0)

使用train_generator()时,您还应设置max_q_size参数。它默认设置为10,这意味着你只需要加载10个(因为train_generator()用于从外部源流式传输数据,而不是为了节省内存)。我建议为您的目的设置max_q_size=1