keras的get_value运行越来越慢的解决方案

keras 深度学习框架中get_value函数运行越来越慢,内存消耗越来越大问题

问题描述

如上图所示,经过时间和内存消耗跟踪测试,发现是keras.backend.get_value() 函数导致的程序越来越慢,而且严重的造成内存泄露;

查看该函数内部实现,发现一个主要核心是x.eval(session=get_session()),该语句可能是导致内存泄露和运行慢的核心语句; 根据查看一些博文得到了运行得越来越慢的

原因该x.eval函数会添加新的节点到tf的图中;而这也导致了tf的图越来越大,内存泄露;

解决方法

import tensorflow.keras.backend as K

def get_my_session(gpu_fraction=0.1):
    '''Assume that you have 6GB of GPU memory and want to allocate ~2GB'''

    num_threads = os.environ.get('OMP_NUM_THREADS')
    gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=gpu_fraction)

    if num_threads:
        return tf.Session(config=tf.ConfigProto(
            gpu_options=gpu_options, intra_op_parallelism_threads=num_threads))
    else:
        return tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

K.set_session(get_my_session())

如上图所示, 我在使用tensorflow之前(也就是该工程文件前面),对session进行自定义,然后用自定义的session设定keras.backend.set_session();

然后删除get_value() 函数,直接用get_value()中所使用的执行语句x.eval(session=get_my_session());这样这个添加节点导致内存泄露的核心语句x.eval()就使用的是该工程统一自定义session,然后用tf.reset_default_graph() 对图重置就可以了

即上图问题代码修改为:

output = ctc_decode(y_pred,input_length=input_length,)
output = output[0][0]
out = output.eval(session=get_my_session())
# 删除 K.get_value(out[0][0])
tf.reset_default_graph() # 然后重置tf图,这句很关键

这样就解决了get_value()导致的越来越慢的问题;

个人认为:这样可能就不会总是添加新的节点,导致tf图不断地无限变大;而是重复使用这一个自定义的节点。

补充:tensorflow与keras之间版本问题引起get_session问题解决办法

1.产生报错原因

import tensorflow.keras.backend as K
def __init__(self, **kwargs):
    self.__dict__.update(self._defaults) # set up default values
    self.__dict__.update(kwargs) # and update with user overrides
    self.class_names = self._get_class()
    self.anchors = self._get_anchors()
    self.sess = K.get_session()

报错如下:

get_session is not available when using TensorFlow 2.0.

意思是 tf2.0 没有 get_session

2.解决方案1

import tensorflow.python.keras.backend as K
sess = K.get_session()

3. 解决方案2

import tensorflow as tf
sess = tf.compat.v1.keras.backend.get_session()

之前一直采用方案1 解决,感觉比较方便;但是解决方案1 有其它属性会丢失问题

比如AttributeError: module ‘keras.backend' has no attribute image_dim_ordering

所以建议大家采用方案2

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Tensorflow训练模型越来越慢的2种解决方案

    1 解决方案 [方案一] 载入模型结构放在全局,即tensorflow会话外层. '''载入模型结构:最关键的一步''' saver = tf.train.Saver() '''建立会话''' with tf.Session() as sess: for i in range(STEPS): '''开始训练''' _, loss_1, acc, summary = sess.run([train_op_1, train_loss, train_acc, summary_op], feed_dic

  • 解决keras backend 越跑越慢问题

    Keras运行迭代一定代数以后,速度越来越慢,经检查是因为在循环迭代过程中增加了新的计算节点,导致计算节点越来越多,内存被占用完,速度变慢. 判断是否在循环迭代过程中增加了新的计算节点,可以用下面的语句: tf.Graph.finalize() 如果增加了新的计算节点,就会报错,如果没有报错,说明没有增加计算节点. 补充知识:win10下pytorch,tensorflow,keras+tf速度对比 采用GitHub上的代码 运行类似vgg模型,在cifar10上训练,结果朋友torch与ten

  • 解决Keras中循环使用K.ctc_decode内存不释放的问题

    如下一段代码,在多次调用了K.ctc_decode时,会发现程序占用的内存会越来越高,执行速度越来越慢. data = generator(...) model = init_model(...) for i in range(NUM): x, y = next(data) _y = model.predict(x) shape = _y.shape input_length = np.ones(shape[0]) * shape[1] ctc_decode = K.ctc_decode(_y,

  • keras的get_value运行越来越慢的解决方案

    keras 深度学习框架中get_value函数运行越来越慢,内存消耗越来越大问题 问题描述 如上图所示,经过时间和内存消耗跟踪测试,发现是keras.backend.get_value() 函数导致的程序越来越慢,而且严重的造成内存泄露: 查看该函数内部实现,发现一个主要核心是x.eval(session=get_session()),该语句可能是导致内存泄露和运行慢的核心语句: 根据查看一些博文得到了运行得越来越慢的 原因:该x.eval函数会添加新的节点到tf的图中:而这也导致了tf的图越

  • python脚本打包后无法运行exe文件的解决方案

    技术栈win7+python3+selenium 之前有个需求需要实现自动化提流程,为了在任何电脑都能实现该功能,特此写了个爬虫,并将其打包成EXE文件,但在点击EXE文件是出现了问题 点击exe文件终端小黑窗一闪而过 为了看到终端是否有报错可以在该exe文件目录下输入cmd执行终端,并在终端中输入exe文件名称如下 回车后会看到报错 一开始怎么也无法找到错误所致(因为在虚拟环境都有导入selenium包),后来索性直接在windows环境下pip install selenium,成功的解决了

  • 基于Keras 循环训练模型跑数据时内存泄漏的解决方式

    在使用完模型之后,添加这两行代码即可清空之前model占用的内存: import tensorflow as tf from keras import backend as K K.clear_session() tf.reset_default_graph() 补充知识:keras 多个模型测试阶段速度越来越慢问题的解决方法 问题描述 在实际应用或比赛中,经常会用到交叉验证(10倍或5倍)来提高泛化能力,这样在预测时需要加载多个模型.常用的方法为 mods = [] from keras.ut

  • windows安装TensorFlow和Keras遇到的问题及其解决方法

    安装TensorFlow在Windows上,真是让我心力交瘁,想死的心都有了,在Windows上做开发真的让人发狂. 首先说一下我的经历,本来也就是起初,网上说python3.7不支持TensorFlow环境,而且使用Anaconda最好,所以我将我之前Windows上所有的python环境卸载掉!!!,对没错,是所有,包括Anaconda环境,python环境,pycharm环境也卸载掉了.而且我丧心病狂的在电脑上找几乎所有关于python的字眼,全部删除掉,统统不留.只是为了铁了心在Wind

  • python读取大文件越来越慢的原因与解决

    背景: 今天同事写代码,用python读取一个四五百兆的文件,然后做一串逻辑上很直观的处理.结果处理了一天还没有出来结果.问题出在哪里呢? 解决: 1. 同事打印了在不同时间点的时间,在需要的地方插入如下代码: print time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) 发现一个规律,执行速度到后面时间越来越长,也就是处理速度越来越慢. 2. 为什么会越来越慢呢? 1)可能原因1,GC 的问题,有篇文章里面写,pyth

  • vue项目中常见问题及解决方案(推荐)

    webpack项目中自动引入全局scss变量文件 假设我们有一个公共的scss变量文件variables.scss /*存放所有全局变量*/ $card-title:#C7D200; //首页 卡片标题颜色 $bc-color:#182037; $hoverColor: #7abef9; //链接hover颜色 $fontColor: #E6EFFF; //字体颜色-白色 webpack要识别scss,需要先安装sass的loader npm install --save-dev sass-lo

  • 详解IDEA JUnit5测试套件运行错误的问题

    1.问题 在Idea 2017.3中,建立JUnit5的测试用例Test Case,同时建立JUnit4的测试套件,运行测试套件时提示出错"java.lang.Exception: No runnable methods". 2.分析 Java进行单元测试时,一般会建立多个测试用例Test Case,或者多个测试类(每个测试类包括多个测试用例),但如果需要同时运行这些测试用例,一般在JUnit4中会采用测试套件,通过运行测试套件,在套件中一次运行多个测试用例类. 参考解答: 能够使用J

  • Keras—embedding嵌入层的用法详解

    最近在工作中进行了NLP的内容,使用的还是Keras中embedding的词嵌入来做的. Keras中embedding层做一下介绍. 中文文档地址:https://keras.io/zh/layers/embeddings/ 参数如下: 其中参数重点有input_dim,output_dim,非必选参数input_length. 初始化方法参数设置后面会单独总结一下. demo使用预训练(使用百度百科(word2vec)的语料库)参考 embedding使用的demo参考: def creat

  • Keras - GPU ID 和显存占用设定步骤

    初步尝试 Keras (基于 Tensorflow 后端)深度框架时, 发现其对于 GPU 的使用比较神奇, 默认竟然是全部占满显存, 1080Ti 跑个小分类问题, 就一下子满了. 而且是服务器上的两张 1080Ti. 服务器上的多张 GPU 都占满, 有点浪费性能. 因此, 需要类似于 Caffe 等框架的可以设定 GPU ID 和显存自动按需分配. 实际中发现, Keras 还可以限制 GPU 显存占用量. 这里涉及到的内容有: GPU ID 设定 GPU 显存占用按需分配 GPU 显存占

  • 浅析关于Keras的安装(pycharm)和初步理解

    Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行.Keras 的开发重点是支持快速的实验.能够以最小的时延把你的想法转换为实验结果,是做好研究的关键. 安装 Keras 兼容的 Python 版本: Python 2.7-3.6. 本人使用的是pycharm-2019.3版本 第一步.直接在命令窗口下 pip install keras==2.1.6 这里我之前设置了阿里的镜像,如果使用其他镜像,或者之

随机推荐