文章目录

  1. 1. TensorFlow是什么
  2. 2. TensorFlow 计算模型
  3. 3. TensorFlow 案例讲解
  4. 4. 参考资料

TensorFlow是什么

Tensor(张量)意味着 N 维数组,Flow(流)意味着基于数据流图的计算,TensorFlow 即为张量从图的一端流动到另一端。

TensorFlow 计算模型

TensorFlow 中的所有计算都会被转化为计算图上的节点,换句话说,使用 TensorFlow 图来表示计算任务。图中的节点被称之为 op。一个 op 获得 0 个或多个 Tensor 执行计算, 同时产生 0 个或多个 Tensor。Tensor 看作是一个 n 维的数组或列表。图必须在会话里被启动。

enter image description here

Tensor 主要三个属性:名字(name)、维度(shape)、类型(type) 。

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

其中,名称是张量的唯一标识符。此外,如果不指定类型,TensorFlow 会给出默认的类型,比如不带小数点的数会默认为 int32,带小数点的会默认为 float32。TensorFlow 支持 14 种类型:实数(tf.float32, tf.float64)、整数(tf.int8, tf.int16, tf.int32, tf.int64, tf.uint8)、布尔型(tf.bool)、复数(tf.complex64, tf.complex128)。

TensorFlow 案例讲解

现在,我们来看一个案例。

import tensorflow as tf
import numpy as np

# 使用 NumPy 生成假数据
x_data = np.float32(np.random.rand(2, 100))
y_data = np.dot([0.100, 0.200], x_data) + 0.300

# 构造一个线性模型
b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y = tf.matmul(W, 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)
    for step in range(0, 201):
        sess.run(train)
        if step % 20 == 0:
            print(step, sess.run([W, b]))

这里,首先需要通过import tensorflow as tf载入 Tensorflow,并且使用tf来代替tensorflow作为模块名称。

此外,我们还可以通过import numpy as np载入 numpy 库,并使用np来代替numpy作为模块名称。

这段代码,调用来 TensorFlow 变量的声明函数 tf.Variable,并进行设置。在神经网络中,偏置项 b 通常会使用常数设置初始值,这里设置一个初始值全部为 0 且长度为 1 的变量。并且设置 w 为 -1 ~ 1 区间的正态分布的 1 x 2 的矩阵。

b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))

这里列出 TensorFlow 目前支持的常用的常量声明方法与随机数生成器。

函数名称 功能 样例
tf.zeros 产生全 0 数组 tf.zeros([2,3],int32)–>[[0,0,0],[0,0,0]]
tf.ones 产生全 1 数组 tf.ones([2,3],int32)–>[[1,1,1],[1,1,1]]
tf.fill 产生一个给定值的数组 tf.fill([2,3],9)–>[[9,9,9],[9,9,9]]
tf.constant 产生一个给定值常量 tf.constant([1,2,3])–>[1,2,3]
函数名称 随机数分布 主要参数
tf.random_normal 正太分布 平均值、标准差、取值类型
tf.truncated_normal 正太分布,如果随机出来的值偏离均值超过2个标准差,重新随机 平均值、标准差、取值类型
tf.random_uniform 平均分布 最小、最大取值、取值类型
tf.random_gamma Gamma 分布 形状参数 alpha、尺度参数 beta、取值类型

此外,需要进行变量的初始化。这里,使用tf.global_variables_initializer函数实现初始化所有变量的过程。

init = tf.global_variables_initializer()

注意的是,initialize_all_variables已被弃用,已在 2017-03-02 之后删除。 现在,使用tf.global_variables_initializer代替。

这里,使用最小化方差、梯度下降法、最小化代价函数进行反向传播优化。具体的细节,笔者会在后面的内部中介绍。

# 二次代价函数
loss = tf.reduce_mean(tf.square(y_data - y))
# 梯度下降法
optimizer = tf.train.GradientDescentOptimizer(0.2)
# 最小化代价函数
train = optimizer.minimize(loss)

值得一提的是,使用通过 Python 的上下文管理器 with 方式建立会话 Session 的好处在于,可以自动释放资源会话 Session 资源。

with tf.Session() as sess

调用 sess 的 ‘run()’ 方法来执行 op。

sess.run(init)
sess.run(train)

最后,让样本训练 500 次。得出结果。

0 [array([[ 0.19558471,  0.62304527]], dtype=float32), array([ 0.01404626], dtype=float32)]
20 [array([[ 0.19304983,  0.47428533]], dtype=float32), array([ 0.10306214], dtype=float32)]
40 [array([[ 0.17740306,  0.37928984]], dtype=float32), array([ 0.16211413], dtype=float32)]
60 [array([[ 0.1604038 ,  0.31869021]], dtype=float32), array([ 0.20365976], dtype=float32)]
80 [array([[ 0.14540802,  0.27939948]], dtype=float32), array([ 0.23279093], dtype=float32)]
100 [array([[ 0.13333426,  0.25356638]], dtype=float32), array([ 0.25316691], dtype=float32)]
120 [array([[ 0.12408604,  0.23638172]], dtype=float32), array([ 0.26739314], dtype=float32)]
140 [array([[ 0.11721428,  0.22484048]], dtype=float32), array([ 0.27731228], dtype=float32)]
160 [array([[ 0.11220838,  0.2170298 ]], dtype=float32), array([ 0.28422141], dtype=float32)]
180 [array([[ 0.10861033,  0.21171173]], dtype=float32), array([ 0.28903037], dtype=float32)]
200 [array([[ 0.10604832,  0.20807374]], dtype=float32), array([ 0.29237565], dtype=float32)]
220 [array([[ 0.10423617,  0.20557596]], dtype=float32), array([ 0.29470184], dtype=float32)]
240 [array([[ 0.10296052,  0.20385621]], dtype=float32), array([ 0.29631886], dtype=float32)]
260 [array([[ 0.10206571,  0.20266965]], dtype=float32), array([ 0.29744262], dtype=float32)]
280 [array([[ 0.10143965,  0.20184968]], dtype=float32), array([ 0.29822347], dtype=float32)]
300 [array([[ 0.10100244,  0.20128232]], dtype=float32), array([ 0.29876596], dtype=float32)]
320 [array([[ 0.10069754,  0.20088936]], dtype=float32), array([ 0.29914287], dtype=float32)]
340 [array([[ 0.10048515,  0.20061703]], dtype=float32), array([ 0.29940468], dtype=float32)]
360 [array([[ 0.10033728,  0.20042817]], dtype=float32), array([ 0.29958653], dtype=float32)]
380 [array([[ 0.10023441,  0.20029721]], dtype=float32), array([ 0.29971284], dtype=float32)]
400 [array([[ 0.1001629 ,  0.20020632]], dtype=float32), array([ 0.29980054], dtype=float32)]
420 [array([[ 0.1001132 ,  0.20014326]], dtype=float32), array([ 0.29986146], dtype=float32)]
440 [array([[ 0.10007864,  0.20009947]], dtype=float32), array([ 0.29990378], dtype=float32)]
460 [array([[ 0.10005464,  0.20006908]], dtype=float32), array([ 0.29993317], dtype=float32)]
480 [array([[ 0.10003795,  0.20004795]], dtype=float32), array([ 0.29995361], dtype=float32)]
500 [array([[ 0.10002635,  0.20003332]], dtype=float32), array([ 0.29996777], dtype=float32)]

可以发现,最后训练完的结果非常接近真实的结果了。

参考资料

(完)

微信公众号

文章目录

  1. 1. TensorFlow是什么
  2. 2. TensorFlow 计算模型
  3. 3. TensorFlow 案例讲解
  4. 4. 参考资料