- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章keras的get_value运行越来越慢的解决方案由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
keras 深度学习框架中get_value函数运行越来越慢,内存消耗越来越大问题 。
如上图所示,经过时间和内存消耗跟踪测试,发现是keras.backend.get_value() 函数导致的程序越来越慢,而且严重的造成内存泄露; 。
查看该函数内部实现,发现一个主要核心是x.eval(session=get_session()),该语句可能是导致内存泄露和运行慢的核心语句; 根据查看一些博文得到了运行得越来越慢的 。
原因:该x.eval函数会添加新的节点到tf的图中;而这也导致了tf的图越来越大,内存泄露; 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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() 对图重置就可以了 。
1
2
3
4
5
|
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
2
3
4
5
6
7
|
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 。
1
2
|
import
tensorflow.python.keras.backend as K
sess
=
K.get_session()
|
1
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 。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://blog.csdn.net/mingshili/article/details/81941677 。
最后此篇关于keras的get_value运行越来越慢的解决方案的文章就讲到这里了,如果你想了解更多关于keras的get_value运行越来越慢的解决方案的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是一名优秀的程序员,十分优秀!