Tensorflow分配内存:38535168的分配超过系统内存的10%

时间:2018-05-12 08:09:10

标签: python tensorflow memory keras-layer resnet

使用ResNet50预训练的权重我正在尝试构建分类器。代码库完全在Keras高级Tensorflow API中实现。完整的代码发布在下面的GitHub链接中。

源代码:Classification Using RestNet50 Architecture

预训练模型的文件大小 94.7mb

我加载了预先训练过的文件

new_model = Sequential()

new_model.add(ResNet50(include_top=False,
                pooling='avg',
                weights=resnet_weight_paths))

并适合模型

train_generator = data_generator.flow_from_directory(
    'path_to_the_training_set',
    target_size = (IMG_SIZE,IMG_SIZE),
    batch_size = 12,
    class_mode = 'categorical'
    )

validation_generator = data_generator.flow_from_directory(
    'path_to_the_validation_set',
    target_size = (IMG_SIZE,IMG_SIZE),
    class_mode = 'categorical'
    )

#compile the model

new_model.fit_generator(
    train_generator,
    steps_per_epoch = 3,
    validation_data = validation_generator,
    validation_steps = 1
)

在训练数据集中,我有两个文件夹狗和猫,每个持有近10,000张图像。当我编译脚本时,我收到以下错误

  

Epoch 1/1 2018-05-12 13:04:45.847298:W   tensorflow / core / framework / allocator.cc:101] 38535168的分配   超过系统内存的10%。 2018-05-12 13:04:46.845021:W   tensorflow / core / framework / allocator.cc:101] 37171200的分配   超过系统内存的10%。 2018-05-12 13:04:47.552176:W   tensorflow / core / framework / allocator.cc:101] 37171200的分配   超过系统内存的10%。 2018-05-12 13:04:48.199240:W   tensorflow / core / framework / allocator.cc:101] 37171200的分配   超过系统内存的10%。 2018-05-12 13:04:48.918930:W   tensorflow / core / framework / allocator.cc:101] 37171200的分配   超过系统内存的10%。 2018-05-12 13:04:49.274137:W   tensorflow / core / framework / allocator.cc:101] 19267584的分配   超过系统内存的10%。 2018-05-12 13:04:49.647061:W   tensorflow / core / framework / allocator.cc:101] 19267584的分配   超过系统内存的10%。 2018-05-12 13:04:50.028839:W   tensorflow / core / framework / allocator.cc:101] 19267584的分配   超过系统内存的10%。 2018-05-12 13:04:50.413735:W   tensorflow / core / framework / allocator.cc:101] 19267584的分配   超过系统内存的10%。

优化加载预训练模型(或)的方法的任何想法都摆脱了这条警告信息?

谢谢!

7 个答案:

答案 0 :(得分:7)

尝试将batch_size属性减小为一个较小的数字(例如1,2或3)。 示例:

train_generator = data_generator.flow_from_directory(
    'path_to_the_training_set',
    target_size = (IMG_SIZE,IMG_SIZE),
    batch_size = 2,
    class_mode = 'categorical'
    )

答案 1 :(得分:3)

我在CPU上运行小型模型,并且遇到相同的问题。添加:os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'解决了该问题。

答案 2 :(得分:3)

我遇到了同样的问题,并且得出结论,看到此错误时要考虑两个因素: 1- batch_size ==>,因为这负责每个时期要处理的数据大小 2- image_size ==>图片尺寸(图片尺寸)越大,要处理的数据越多

因此对于这两个因素,RAM无法处理所有必需的数据。

为解决此问题,我尝试了两种情况: 第一次将batch_size形式从32更改为3或2 第二个将image_size从(608,608)减少到(416,416)

答案 3 :(得分:2)

或者,您可以设置环境变量TF_CPP_MIN_LOG_LEVEL=2来过滤掉信息和警告消息。我在DriveApp.searchFiles上找到了。为此,您可以在python中使用this github issue where they complain about the same output中的解决方案:

import os
import tensorflow as tf
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

您甚至可以随意打开和关闭它。我在运行代码之前测试了最大可能的批处理大小,并且在执行此操作时可以禁用警告和错误。

答案 4 :(得分:2)

在使用Docker和Jupyter Notebook运行Tensorflow容器时遇到同样的问题。我能够通过增加容器内存来解决此问题。

Mac OS 上,您可以轻松地从以下位置进行操作:

       Docker Icon > Preferences >  Advanced > Memory

将滚动条拖动到最大(例如4GB)。应用,它将重新启动Docker引擎。

现在再次运行张量流容器。

在单独的终端中使用docker stats命令很方便 它实时显示容器的内存使用情况,您可以看到正在消耗多少内存:

CONTAINER ID   NAME   CPU %   MEM USAGE / LIMIT     MEM %    NET I/O             BLOCK I/O           PIDS
3170c0b402cc   mytf   0.04%   588.6MiB / 3.855GiB   14.91%   13.1MB / 3.06MB     214MB / 3.13MB      21

答案 5 :(得分:0)

我遇到了同样的错误,我尝试设置os.environment标志...但是没有成功。

然后我继续进行下去,并将批量大小从16减少到8,然后它开始正常工作。 因为这是因为,训练方法考虑了批处理的大小...我觉得,减小图像大小也可以..如上所述。

答案 6 :(得分:0)

我在 Linux 平台上运行代码时遇到了同样的问题。 我将之前设置为 0 的交换内存大小更改为 1 GB,问题得到解决。

有关更多详细信息,您可以咨询此链接。

https://linuxize.com/post/create-a-linux-swap-file/