TensorFlow快速上手

本文首发于我的个人博客QIMING.INFO,转载请带上链接及署名。

TensorFlow是目前很火的一款深度学习框架,其源码是用C++写的,保证了运行速度,其又提供了Python的接口,大大降低了程序猿们学习新语言的成本,所以在深度学习领域广为流行。

但是很多人在初学TensorFlow时会觉得有些难以入手,霎时间接触诸如张量、图、会话等概念会有点吃力,所以本文将介绍如何快速入门TensorFlow并上手写代码,一边实践一边理解概念,提升学习速度。

1 安装

安装TensorFlow有多种方式,为了快速上手写代码,这里介绍一种最为简单的方法,像安装其他Python库一样,直接用pip就好,即在命令行中输入:

pip install tensorflow

注1:还可以通过Docker安装或从源码安装。

注2:此处安装的是仅支持CPU版本的,支持GPU版本的将在后续文章中说明。

2 使用

在使用的第一步,惯例我们先引入tensorflow库,为方便起见,将其用tf简写,如下:

import tensorflow as tf

2.1 张量

张量即tensor,是TensorFlow中所有数据的基本表现形式,TensorFlow中的常量、变量都属于张量。

2.1.1 常量

a = tf.constant([[1.,2.],[3.,4.]],name='const_a')
print(a)

这段代码创建了一个常量a,直接输出后的结果如下:

Tensor("const_a:0", shape=(2,2), dtype=float32)

可以看到直接输出的结果并不是我们给定的值,而是一个张量的结构。(输出值需要在会话中进行,下文会进行介绍)

其中const_a:0表示aconst_a的第一个值(也是唯一一个),shape代表维度,(2,2)表示此张量是个2x2的矩阵,第三个属性为数据类型。

常用的常数生成函数还有:

# 产生全是0的2x3矩阵
tf.zeros([2,3],int32)
# 产生全是1的2x3矩阵
tf.ones([2,3],int32)
# 产生全是9的2x3矩阵
tf.fill([2,3],9)

2.1.2 变量

变量在TensorFlow中十分重要,因其可以在计算中修改,所以神经网络的模型参数一般使用变量。

创建变量可以直接调用Variable函数,将值传入即可。

# 创建一个全1的2x2矩阵
x = tf.Variable(tf.ones([2,2]),name='var_x')

需要注意的是,使用变量时,需要对其进行初始化:

init = tf.global_variables_initializer()

2.2 会话

TensorFlow中,所有操作都只能在会话(Session)中进行。

假如我们想求上文中创建的常量a和变量x的和,完整代码如下:

import tensorflow as tf

# 创建一个2x2的矩阵常量a,值为[[1.0,2.0],[3.0,4.0]]
a = tf.constant([[1.,2.],[3.,4.]],name='const_a')
# 创建一个全1的2x2矩阵
x = tf.Variable(tf.ones([2,2]),name='var_x')
# 定义一个加法操作
add = tf.add(a,x) # 或 add = a + x
# 初始化所有变量
init = tf.global_variables_initializer()
# 利用Python上下文管理器创建Session,并在其中执行有关操作
with tf.Session() as sess:
    # 执行初始化变量
    sess.run(init)
    # 执行加法运算并输出结果
    print(sess.run(add))

注1:创建常量、变量时的name参数可省略

注2:创建Session的另一种方法:

# 创建会话
sess = tf.Session()
# 调用会话来执行节点的计算,假如是上例中的add
sess.run(add)
# 执行结束后关闭会话
sess.close()

这种方式不好的地方在于当程序因为异常而退出时,Session.close()可能不会执行从而导致资源泄露。

运行后输出如下:

[[2. 3.]
 [4. 5.]]

2.3 图

至此,你是否隐约感受到了TensorFlow在运行时的一点不同?

不同于一般的程序,TensorFlow程序有两个阶段:

  1. 定义计算
  2. 执行计算

也就是说TensorFlow会将所有运算都定义好后再在Session中执行,不像一般程序,可以一边定义一边执行。

事实上,TensorFlow在进行第一个阶段时就是将计算定义在了一个图(Graph)里,在上文中,是将操作放到了TensorFlow默认提供的一张计算图中了,当然,我们也可以自己新建一张图,如下:

# 创建一张图g
g = tf.Graph()
with g.as_default():
    # 在图中定义常量c为5.0
    c = tf.constant(5.0)

# 创建一个Session,将图g作为参数传给它
with tf.Session(graph=g) as sess:
    # 输出c
    print(sess.run(c))
    
# 执行后,输出结果为:5.0

2.4 拟合线性回归

了解了上述基本概念和操作,接下来,我们来动手实践来拟合y=0.1x+0.2这个函数吧。

import tensorflow as tf
import numpy as np

# 使用numpy生成100个随机点
x_data = np.random.rand(100)
y_data = x_data*0.1 + 0.2

# 给k随机赋初值2.2
k = tf.Variable(2.2)
# 给b随机赋初值1.1
b = tf.Variable(1.1)
# 构造一个线性模型
y = k*x_data + b

# 二次代价函数的损失值
loss = tf.reduce_mean(tf.square(y_data-y))
# 定义一个梯度下降法来进行训练的优化器
optimizer = tf.train.GradientDescentOptimizer(0.2)
# 最小化代价函数
train = optimizer.minimize(loss)

# 初始化变量
init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    # 训练201次
    for step in range(201):
        sess.run(train)
        # 每训练20次 输出一下结果
        if step%20 == 0:
            print(step,sess.run([k,b]))

训练结果如下:

0 [1.7758392, 0.34141564]
20 [0.87541753, -0.19211102]
40 [0.57061648, -0.03798072]
60 [0.38562673, 0.055564649]
80 [0.27335268, 0.11233925]
100 [0.20521127, 0.14679691]
120 [0.16385485, 0.16770996]
140 [0.13875481, 0.18040252]
160 [0.12352109, 0.18810588]
180 [0.11427544, 0.19278121]
200 [0.10866406, 0.19561876]

可以看出,在训练了201次后,k值和b值都分别非常接近0.1和0.2了。

3 参考资料

[1]TensorFlow中文社区.基本用法 | TensorFlow 官方文档中文版
[2]郑泽宇,梁博文,顾思宇.TensorFlow:实战Goole深度学习框架(第2版)[M].北京:电子工业出版社.2018-02
[3]视频《深度学习框架Tensorflow学习与应用》@Youtube

猜你喜欢

转载自blog.csdn.net/u011630228/article/details/83796323