zoukankan      html  css  js  c++  java
  • tensorflow内存溢出问题

    Tensorflow的静态图结构简洁清晰,符合人的思维。虽然编程上略微有些复杂,但是原理很容易看懂。

    Tensorflow分建图过程和运行图(张量求值)两个阶段,在这两个阶段中都可以定义操作和张量。但是有一个非常容易犯的错误:把操作定义在循环里面。

    例如下面这个例子,tf.assign操作放在了循环里面。

    import tensorflow as tf
    
    x = tf.Variable(1.0, dtype=tf.float32)
    
    with tf.Session()as sess:
        sess.run(tf.global_variables_initializer())
        for i in range(int(5)):
            ass = tf.assign(x, 2.0)
            sess.run(ass)
            del ass  # del操作不会删除ass这个操作结点,只是删除了内存中的引用
            print(tf.get_default_graph().get_operations())#查看图中的所有操作
    print(tf.get_default_graph().get_operations())#session结束了但是session中开辟的变量也没有回收
    
    

    在此例中,大量的“操作结点”被添加到图中,打开任务管理器查找python进程,可以发现内存一直在涨,原因就在于申请了大量的“tf.add”操作结点却无法释放。

    这个问题如何避免呢?只需要把操作结点的定义放在循环外面就可以了。

    举一个错误的例子,我们在计算accuracy时,如果把accuracy的操作结点定义在循环内部,那么随着训练批次的不断增加,会产生大量的操作结点,训练一段时间之后,内存就溢出了。

  • 相关阅读:
    springmvc中request的线程安全问题
    日志帮助类
    模态框的实现
    getopts的使用方法
    自动生成头文件的脚本
    shell脚本中出现图形化界面
    Linux Centos关机命令
    Linux下IP的存储位置
    tar只解压tar包中某个文件
    Swift 笔记1
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/9972853.html
Copyright © 2011-2022 走看看