tensorflow2.0 GPU 版本安装测试教程及新特性初探

安装与测试

TensorFlow2.0安装:

pip install tensorflow-gpu==2.2.0 -i https://pypi.douban.com/simple/
conda install cudnn=7.6.0
# conda install cudatoolkit=10.0.130 # (可选)

TensorFlow2.0的GPU版本测试代码如下:

import tensorflow as tf

print('GPU', tf.test.is_gpu_available())

a = tf.constant(2.0)
b = tf.constant(4.0)
print(a + b)

注意:如果是第一次使用 tensorflow2.0,会在输出 Adding visible gpu devices: 0 之后卡住一阵子,等几分钟就好了,下次运行就正常了

结果如下就证明 tensorflow-gpu 安装成功了

GPU True
tf.Tensor(6.0, shape=(), dtype=float32)

1.X 和 2.X 版本的差异

Eager Execution

细心的你会发现,在 tensorflow2.0 版本中,居然可以直接输出张量的计算结果,如果是以前的1.x 版本,执行同样的代码,你得到的输出是:

GPU True
Tensor(“add:0”, shape=(), dtype=float32)

在1.x 版本中,如果你想要得到真实的计算结果,需要初始化全局变量 → 建立会话 → 执行计算,最终才能打印出张量的运算结果:

import tensorflow as tf
sess = tf.Session()
a = tf.constant(2.0)
b = tf.constant(4.0)
print(sess.run(a + b))

这是 TensorFlow 2.0 带来的最大改变之一,他将 1.x 的 Graph Execution(图与会话机制)更改为 Eager Execution(动态图机制)。带来的最直观的好处是:不再需要手动管理图和会话。例如,现在使用示例张量进行数学计算,可以像 Python 一样直接相加。在 TensorFlow 2.0 中,Eager Execution 模式是默认开启的,这意味着 TensorFlow 代码被定义后会立即运行,而不是先将节点和边缘添加一个图上,稍后再在一个会话中运行。

对于定义的张量,还可以直接通过 .numpy() 方法输出 numpy 数组:

c = tf.Variable([[1, 2], [3, 4]])
print('c:')
print(c)
print('c.numpy():')
print(c.numpy())

输出:

c:
<tf.Variable 'Variable:0' shape=(2, 2) dtype=int32, numpy=
array([[1, 2],
       [3, 4]])>
c.numpy():
[[1 2]
 [3 4]]

虽然程序是可以动态执行了,但是梯度计算怎么办?在TensorFlow 1.x静态图时代,我们知道每个静态图都有两部分,一部分是前向图,另一部分是反向图。反向图就是用来计算梯度的,用在整个训练过程中。而TensorFlow 2.0默认是eager模式,每行代码顺序执行,没有了构建图的过程,但是可以通过 tf.GradientTape api 来实现自动求导功能。具体内容不展开讲,可以参考下面链接中的讲解:

tf.GradientTape详解:梯度求解利器

TensorFlow2.0教程-自动求导

TensorFlow 2.0引入的eager提高了代码的简洁性,而且更容易debug。但是对于性能来说,eager执行相比Graph模式会有一定的损失。但是好在,TensorFlow 2.0引入了tf.function和AutoGraph来缩小eager执行和Graph模式的性能差距,其核心是将一系列的Python语法转化为高性能的graph操作。

AutoGraph

AutoGraph 主要是可以将一些常用的Python代码转化为TensorFlow支持的代码,例如:

def square_if_positive(x):
    if x > 0:
        x = x * x
    else:
        x = 0.0
    return x

# eager 模式
print('results: %2.2f, %2.2f' % (square_if_positive(tf.constant(8.0)),
                                 square_if_positive(tf.constant(-9.0))))

输出:

results: 64.00, 0.00

上面我们定义了一个 square_if_positive 函数,它内部使用的 Python 的原生的if语法,对于TensorFlow 2.0的eager模式,这是没有问题的。但是如果你需要在 1.x 版本执行,代码就是这样的:

# graph 模式
tf_square_if_positive = tf.autograph.to_graph(square_if_positive)

with tf.Graph().as_default():
  # The result works like a regular op: takes tensors in, returns tensors.
  # You can inspect the graph using tf.get_default_graph().as_graph_def()
    g_out1 = tf_square_if_positive(tf.constant( 9.0))
    g_out2 = tf_square_if_positive(tf.constant(-9.0))
    with tf.compat.v1.Session() as sess:
        print('Graph results: %2.2f, %2.2f\n' % (sess.run(g_out1), sess.run(g_out2)))

输出:

results: 81.00, 0.00

大家要注意eager模式和Graph模式的差异,尽管结果是一样的,但是Graph模式更高效。从本质上讲,AutoGraph是将Python代码转为TensorFlow原生的代码。

tf.keras

TensorFlow 2.0全面keras化:如果你想使用高级的layers,只能选择keras。TensorFlow 1.x 存在 tf.layers以及tf.contrib.slim等高级API来创建模型,但是2.0仅仅支持tf.keras.layers。

参考文章:

Tensorflow 2.0到底好在哪里?

TensorFlow 2.0 新增变化特性

【060】tensorflow2.0 与tensorflow1.0 的性能区别和迁移

你可能感兴趣的:(深度学习相关,tensorflow2.0,GPU,安装教程)