zoukankan      html  css  js  c++  java
  • Tensorflow结点打包和依赖控制

    深度学习库能够充分发挥GPU并行计算的能力,但是有时我们却不得不需要串行。这时就需要用到依赖控制。

    import tensorflow as tf
    
    a = tf.Variable(1)
    b = tf.Variable(2)
    s = tf.add(a, b)
    asiggn = tf.assign(a, 4)
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        print(sess.run([a, b, s, asiggn]))
    
    

    理论上,这段程序有时输出6,有时输出3。也就是说,求和操作和复制操作无法确定谁先执行。

    如果想要先求和再赋值,那么需要使用依赖控制指明依赖。

    import tensorflow as tf
    
    a = tf.Variable(1)
    b = tf.Variable(2)
    s = tf.add(a, b)
    with tf.control_dependencies([s]):
        asiggn = tf.assign(a, 4)
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        print(sess.run([a, b, s, asiggn]))
    
    

    每一次sess.run,每个结点只求解一次。

    然而需要理解的一个关键点是:
    将多个结点打包之后,对这个包加上依赖控制,并不会影响被打包的各个结点的依赖。

    # 将结点打包,同时执行多个结点
    import tensorflow as tf
    
    tf.reset_default_graph()
    a = tf.Variable(1, name="a")
    b = tf.Variable(2, name="b")
    c = tf.Variable(3, name="c")
    with tf.control_dependencies([a, b, c]):
        before_sum = tf.add_n([a, b, c])
    a_add1 = tf.assign(a, tf.add(a, 1, name='a_add1'))
    b_add2 = tf.assign(b, tf.add(b, 2, name='b_add2'))
    c_add3 = tf.assign(c, tf.add(c, 3, name='c_add3'))
    
    with tf.control_dependencies([before_sum]):
        # group操作run之后返回值为None,它只负责同时执行,它并不负责控制依赖
        op = tf.group(a_add1, b_add2, c_add3)
    with tf.control_dependencies([op]):  # 如果没有这句话,则sum操作和op操作是并行的,导致出现奇怪的现象
        after_sum = tf.add_n([a, b, c])
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        print(sess.run([before_sum, op, a, b, c, after_sum]))
    
    

    输出为:[12, None, 2, 4, 6, 12]
    表示beforesum并没有在op之前执行。
    要想在op之前求before_sum,那就需要为op中的每个结点添加依赖

    # 将结点打包,同时执行多个结点
    import tensorflow as tf
    
    tf.reset_default_graph()
    a = tf.Variable(1, name="a")
    b = tf.Variable(2, name="b")
    c = tf.Variable(3, name="c")
    with tf.control_dependencies([a, b, c]):
        before_sum = tf.add_n([a, b, c])
    with tf.control_dependencies([before_sum]):
        a_add1 = tf.assign(a, tf.add(a, 1, name='a_add1'))
    with tf.control_dependencies([before_sum]):
        b_add2 = tf.assign(b, tf.add(b, 2, name='b_add2'))
    with tf.control_dependencies([before_sum]):
        c_add3 = tf.assign(c, tf.add(c, 3, name='c_add3'))
    
    with tf.control_dependencies([before_sum]):
        # group操作run之后返回值为None,它只负责同时执行,它并不负责控制依赖
        op = tf.group(a_add1, b_add2, c_add3)
    with tf.control_dependencies([op]):  # 如果没有这句话,则sum操作和op操作是并行的,导致出现奇怪的现象
        after_sum = tf.add_n([a, b, c])
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        print(sess.run([before_sum, op, a, b, c, after_sum]))
    """
    执行顺序不同会出现什么情况
    """
    
    
  • 相关阅读:
    指向行数组指针和指针数组的区别
    安装文件在icinga上安装check_mk
    模式浏览器火狐、谷歌、IE关于document.body.scrollTop和document.documentElement.scrollTop 以及值为0的问题
    执行对象java面试题目2013/5/16
    属性序列化gson的@Expose注解和@SerializedName注解
    语言编译器编程语言分类及入门
    按钮实现Python绘图工具matplotlib的使用
    实现注册表网页超链接调用应用程序实现
    服务方法android如何保证service不被杀死
    函数日期mysql获取当天日期
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/9559355.html
Copyright © 2011-2022 走看看