欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

深度学习中常见的动态图和静态图

程序员文章站 2024-01-19 12:36:34
...

在我们日常学习中总是听到动态图和静态图的概念,今天就在这里做一个小总结,提醒自己.

目前神经网络框架分为静态图框架动态图框架PyTorchTensorFlowCaffe 等框架最大的区别就是他们拥有不同的计算图表现形式。 TensorFlow使用静态图,这意味着我们先定义计算图,然后不断使用它,而在PyTorch中,每次都会重新构建一个新的计算图。

动态计算意味着程序将按照我们编写命令的顺序进行执行。 这种机制将使得调试更加容易,并且也使得我们将大脑中的想法转化为实际代码变得更加容易。而静态计算则意味着程序在编译执行时将先生成神经网络的结构,然后再执行相应操作。 静态计算是通过先定义后运行的方式,之后再次运行的时候就不再需要重新构建计算图,所以速度会比动态图更快。从理论上讲,静态计算这样的机制允许编译器进行更大程度的优化,但是这也意味着你所期望的程序与编译器实际执行之间存在着更多的代沟。这也意味着,代码中的错误将更加难以发现(比如,如果计算图的结构出现问题,你可能只有在代码执行到相应操作的时候才能发现它)。

# tensorflow
import tensorflow as tf


first_counter = tf.constant(0)
second_counter = tf.constant(10)
def cond(first_counter, second_counter, *args):
    return first_counter < second_counter
    
def body(first_counter, second_counter):
    first_counter = tf.add(first_counter, 2)
    second_counter = tf.add(second_counter, 1)
    return first_counter, second_counter
    
c1, c2 = tf.while_loop(cond, body, [first_counter, second_counter])
with tf.Session() as sess:
    counter_1_res, counter_2_res = sess.run([c1, c2])
print(counter_1_res)
print(counter_2_res)

可以看到TensorFlow需要将整个图构建成静态的,换句话说,每次运行的时候图都是一样的,是不能够改变的,所以不能直接使用Pythonwhile 循环语句,需要使用辅助函数tf.while_loop写成 TensorFlow 内部的形式.

# pytorch
import torch


first_counter = torch.Tensor([0])
second_counter = torch.Tensor([10])
 
while (first_counter < second_counter)[0]:
    first_counter += 2
    second_counter += 1
 
print(first_counter)
print(second_counter)

可以看到 PyTorch 的写法跟Python 的写法是完全一致的,没有任何额外的学习成本.

参考链接:

https://blog.csdn.net/qq_35447659/article/details/83898172

https://www.cnblogs.com/yifdu25/p/8763717.html