3.TensorFlow入门

1.TensorFlow的主要依赖包

  • Protocol Buffer
    用来处理结构化数据(将结构化数据序列化,从数据流中还原结构化数据)。
    结构化数据是具有多种属性的数据。要将结构化数据进行持久化或进行网络传输时,就需要先将它们序列化(将结构化的数据变为数据流的格式,简单说就是变为一个字符串)。
    XML和JSON也是两种常用的结构化数据处理工具。
  • Bazel
    项目空间(workspace)

2.TensorFlow的计算模型:计算图(Flow)

Tensorflow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。
tensorFlow程序执行:

  • 定义计算图中所有的计算
  • 执行计算

在Tensorflow程序中,系统会自动维护一个默认的计算图,还可以使用tf.Graph 函数生成新的计算图。不同计算图上的张量和运算不会共享
Tensorflow的计算图不仅可以用来隔离张量和计算,还提供了管理张量和计算的机制。计算图通过tf,Graph.device函数来指定运行计算的设备。这为使用GPU提供了机制。

g = tf.Graph()
with g.device('/gpu:0'):
	result = a + b

有效整理Tensorflow程序中的资源也是计算图的一个重要功能,在一个计算图中,可以通过集合(collection)来管理不同类型的资源。通过tf.add_to_collection函数将资源加入一个或多个集合中,然后通过tf.get_collection函数获取一个集合里面所有的资源。这里的资源可以是张量、变量、运算。

3.Tensorflow的数据模型:张量(Tensor)

张量(从功能上可以理解为多维数组,实现不是采取数组的形式)只是对Tensorflow中运算结果的引用,在张量中并没有真正保存数字,它保存的是如何得到这些数字的计算过程。
TensorFlow计算的结果不是一个具体的数字,而是一个张量的结构。

Tensor("add:0", shape=(2, ), type=float32

张量的三个属性:name、shape、type

  • name:张量的唯一标识符,同样给出了这个张量是如何计算出来的。node:src_output
  • type:运算中的数据类型要匹配。

张量的使用可以分为两类:

  • 对中间计算结果的引用,提高代码可读性。
  • 当计算图构造完成后,张量可以用来获得计算结果,也就是得到真实的数字,虽然张量本身没有存储具体的数字,但是通过会话(session)就可以得到这些具体的数字。tf.Session().run(result)

4.TensorFlow运行模型:会话

会话拥有并管理Tensorflow程序运行时的所有资源。所有计算完成之后需要关闭会话来帮助系统回收资源,否则会出现资源泄露问题。
Tensorflow使用会话的两种模式:

# 明确调用会话生成函数和关闭会话函数
sess = tf.Session()
sess.run(...)
sess.close()
# 通过Python的上下文管理器来使用会话
with tf.Session() as sess:
	sess.run(...)
# 默认的会话被指定后,可以通过tf.Tensor.eval函数来计算一个张量的取值
sess = tf.Session()
with sess.as_default():
	print(result.eval())
# 功能与上面代码等价
sess = tf.Session()
# 以下两个命令有相同的功能
print(sess.run(result))
print(result.eval(session=sess))
# 直接构建默认会话的函数:tf.InteractiveSession()
# 自动将生成的会话注册为默认会话
# 省去将产生的会话注册为默认会话的过程
sess = tf.InteractiveSession()
print(result.eval())
sess.close()

5.神经网络参数与Tensorflow变量

在Tensorflow中,变量(tf.Variable)的作用就是保存和更新神经网络中的参数

# 标准差为2,均值可通过参数mean指定,默认为0
weights = tf.Variable(tf.random_normal([2, 3], stddev=2))
biases = tf.Variable(tf.zeros([3]))

#通过其他变量的初始值来初始化新的变量
w2 = tf.Variable(weights.initialized_value())
w3 = tf.Variable(weights.initialized_value() * 3)

在Tensorflow中,一个变量的值在被使用前,这个变量的初始化过程要被明确的调用

# 第一步:定义计算图中所有的计算,但是这些被定义的计算在这一步中并不真正的运行
# 通过seed参数设置随机种子,保证每次运行结果是一样的
w1 = tf.Variable(tf.random_normal([2, 3], stddev=2, seed = 1))
w2 = tf.Variable(tf.random_normal([2, 3], stddev=2, seed = 1))
...
y = ...

# 通过会话计算结果
sess = tf.Session()
sess.run(w1.initializer) # 初始化w1
sess.run(w2.initializer) # 初始化w2
# 在计算y之前,将所有用到的变量初始化。
# 虽然在变量定义时给出了变量初始化的方法,但这个方法并没有真正的运行
print(sess.run(y))
sess.close()
# 初始化所有变量
init_op = tf.global_variables_initializer()
sess.run(init_op)
  • 变量和张量的关系?
    在Tensorflow中,变量的声明函数tf.Variable()是一个运算。这个运算的输出结果就是一个张量,这个张量也就是变量。变量是一种特殊的张量

  • 集合(collection):
    所有的变量都会被自动加入到GraphKeys.VARIABLES这个集合中。
    通过tf.global_variables()函数可以得到当前计算图上所有的变量。
    通过变量声明函数中的trainable参数来区分需要优化的参数和其他参数。如果trainable = True,那么这个变量会被加入到GraphKeys.TRAINABLE_VARIABLES集合。可以通过tf.trainable_variables函数得到所有需要优化的参数。
    Tensorflow中提供的神经网络优化算法会将GraphKeys.TRAINABLE_VARIABLES集合中的变量作为默认的优化对象。

  • 变量的两个属性:
    类型(不可改变)和维度。

# 维度在运行中可以改变,通过设置参数validate_shape=False,不推荐使用
w1 = tf.Variable(tf.random_normal([2, 3], stddev=2, seed = 1), name="w1")
w2 = tf.Variable(tf.random_normal([2, 2], stddev=2, seed = 1), name="w2")
tf.assign(w1, w2, validate_shape = False)
  • placeholder机制:
    如果每轮迭代中选取的数据都用变量来表示,那么Tensorflow的计算图将会很大,因为每生成一个常量,Tensorflow都会在计算图中增加一个节点。为了避免这个问题,提供placeholder机制用于提供输入数据。
    placeholder相当于定义了一个位置,这个位置中的数据在程序运行时在指定
    这样在程序中就不需要生成大量的常量,只需将数据通过placeholder传入计算图。
    placeholder中的数据维度可以根据提供的数据推导出,所以不一定要给出。
x = tf.placeholder(tf.float32, shape=(3, 2), name="input")
...
print(sess.run(y, feed_dict={x: [[0.7, 0.9], [0.1, 0.2], [0.2, 0.3]]}))
...
cross_entropy = ...
learning_rate = 0.001
train_step = tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)
...
# 通过运行sess.run(train_step)可以对所有在GraphKeys.TRAINABLES_VARIABLES集合中的变量进行优化
# 使得在当前batch下损失函数更小
sess.run(train_step)
# 将一个张量限制在一个范围之内
tf.clip_by_value(1-y, 1e-10, 1.0)
训练神经网络的过程:
	1.定义神经网络结构和前向传播的输出结果
	2.定义损失函数以及选择反向传播优化的算法
	3.生成会话(tf.Session)并且在训练数据集上反复运行反向传播优化算法

小结

  • 计算图上的每一个节点都是一个运算,而计算图上的边则表示了运算之间的数据传递关系。计算图上还保存了运行每个运算的设备信息(通过CPU或GPU运行)以及运算之间的依赖关系。
  • 张量是Tensorflow的数据模型,Tensorflow中所有运算的输入与输出都是张量。张量本身不存储任何数据,它只是对运算结果的引用
  • 会话是Tensorflow的运算模型,管理一个程序拥有的所有资源,所有的运算都要通过会话执行。
发布了59 篇原创文章 · 获赞 17 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Miracle_520/article/details/93398777