本文节选自由谷歌开发者专家(GDE)李锡涵@snowkylin 编写、广受好评的开源 TensorFlow 入门教程——《简单粗暴TensorFlow 2》。在《【必看】TensorFlow 2 官方安装指南》里,我们为大家详细介绍了 TensorFlow 2.0 的安装方式。在本篇文章,我们将带大家初窥 TensorFlow 2.0。
TensorFlow 2.0 最激动人心的特性之一,在于其引入的 Eager Execution 模式。这使得我们无需构建计算图后再执行计算,而可以做到直观的 “一经调用,立即执行”,从而让我们能够更为方便的构建和调试模型。在本文中,我们即使用 Eager Execution 模式为大家介绍 TensorFlow 的基础操作,包括张量的定义和操作、自动求导机制以及优化器的使用。
文 / 李锡涵,Google Developers Expert
本文节选自《简单粗暴 TensorFlow 2.0》
TensorFlow 1+1
我们可以先简单地将 TensorFlow 视为一个科学计算库(类似于 Python 下的 NumPy)。
首先,我们导入 TensorFlow:
1import tensorflow as tf
警告
在 TensorFlow 1.X 版本中, 必须在导入 TensorFlow 库后调用 tf.enable_eager_execution()
函数以启用 Eager Execution 模式。在 TensorFlow 2.0 版本中,Eager Execution 模式为默认模式,无需额外调用 tf.enable_eager_execution()
函数(不过若要关闭 Eager Execution,则需调用 tf.compat.v1.disable_eager_execution()
函数)。
TensorFlow 使用 张量(Tensor)作为数据的基本单位。TensorFlow 的张量在概念上类似于多维数组,我们可以使用它来描述数学中的标量(0 维数组)、向量(1 维数组)、矩阵(2 维数组)等各种量,示例如下:
1# 定义一个随机数(标量)
2random_float = tf.random.uniform(shape=())
3
4# 定义一个有2个元素的零向量
5zero_vector = tf.zeros(shape=(2))
6
7# 定义两个2×2的常量矩阵
8A = tf.constant([[1., 2.], [3., 4.]])
9B = tf.constant([[5., 6.], [7., 8.]])
张量的重要属性是其形状、类型和值。可以通过张量的 shape
、dtype
属性和 numpy()
方法获得。例如:
1# 查看矩阵A的形状、类型和值
2print(A.shape) # 输出(2, 2),即矩阵的长和宽均为2
3print(A.dtype) # 输出<dtype: 'float32'>
4print(A.numpy()) # 输出[[1. 2.]
5 # [3. 4.]]
小技巧
TensorFlow 的大多数 API 函数会根据输入的值自动推断张量中元素的类型(一般默认为 tf.float32
)。不过你也可以通过加入 dtype
参数来自行指定类型,例如 zero_vector = tf.zeros(shape=(2), dtype=tf.int32)
将使得张量中的元素类型均为整数。张量的 numpy()
方法是将张量的值转换为一个 NumPy 数组。
TensorFlow 里有大量的 操作 (Operation),使得我们可以将已有的张量进行运算后得到新的张量。示例如下:
1C = tf.add(A, B) # 计算矩阵A和B的和
2D = tf.matmul(A, B) # 计算矩阵A和B的乘积
操作完成后,C
和 D
的值分别为:
1tf.Tensor(
2[[ 6. 8.]
3 [10. 12.]], shape=(2, 2), dtype=float32)
4tf.Tensor(
5[[19. 22.]
6 [43. 50.]], shape=(2, 2), dtype=float32)
可见,我们成功使用 tf.add()
操作计算出 ,使用
tf.matmul()
操作计算出: