TensorFlow实战Google深度学习框架(3)

第 3 章入门

3.1 计算模型-计算图

3.1.1 计算图的概念

所有计算在

将转化为计算图的一个节点,计算图上的边代表它们的相互依赖关系。

3.1.2 计算图的使用

程序可以分为两个阶段:定义计算和执行计算。

默认计算图是通过tf.()得到的

它支持通过 tf.Graph() 函数生成新的计算图。不同计算图上的张量和运算不会共享。

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
g1 = tf.Graph()
with g1.as_default():
    # define variable v in g1, and set the default value is zero
    v = tf.get_variable("v", initializer=tf.zeros_initializer()(shape=[1]))
g2 = tf.Graph()
with g2.as_default():
    # define variable v in g2, and set the default value is one
    v = tf.get_variable("v", initializer=tf.ones_initializer()(shape=[1]))
with tf.Session(graph=g1) as sess:
    # show the value of variable v in g1
    tf.initialize_all_variables().run()
    with tf.variable_scope("", reuse=True):

        print(sess.run(tf.get_variable("v")))
        
with tf.Session(graph=g2) as sess:
    # show the value of variable v in g2
    tf.initialize_all_variables().run()
    with tf.variable_scope("", reuse=True):
        print(sess.run(tf.get_variable("v")))

运行结果:

不同的计算图不仅可以用于隔离张量和计算的机制,还可以用于管理张量和计算。因此,我们可以使用 tf.Graph。在运行计算图时指定计算图的运行设备。

图表可用于管理不同类型的资源。例如,通过 tf.您可以将资源添加到一个或多个集合中,然后使用 tf.获取集合中的所有资源。

3.2 数据模型-张量

3.2.1张量概念

张量是管理数据的形式,可以简单理解为多维数组。张量并不真正包含数字,而是这些数字的计算。

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
a = tf.constant([1.0, 2.0], name="a")
b = tf.constant([2.0, 3.0], name="b")
result = tf.add(a, b, name="add")
print(result)

运行结果:

从结果可以看出:结果,不过是张量的结构。张量包含三个属性:名称、维度、类型。张量的命名方式为“node:”,其中node代表节点的名称,表示当前张量从节点的输出。张量会有一个唯一的类型,所有参与操作的张量都会进行类型检查,发现类型不匹配时会报错。

3.2.2 张量的使用

张量有两种用途:一种是作为中间计算结果的引用。另一种是计算图构建完成后,可以使用张量获取计算结果,得到实数。

图片[1]-TensorFlow实战Google深度学习框架(3)-唐朝资源网

3.3 运行模型 – 会话

会话在程序运行时拥有并管理所有资源。有两种使用会话的方法:

# first method
sess = tf.Session() sess.run() sess.close()

# second method
with tf.Session() as sess:
  sess.run()

后者比前者好,因为它可以避免异常退出时资源释放和忘记调用.close函数的问题。由此产生的资源泄漏问题。

张量的eval函数可以通过以下方式计算张量的值:

sess = tf.Session()
# two command below have same effect
print(sess.run(result))
print(result.eval(session=sess))

和张量一样可以设置默认值,但不同的是需要手动指定默认。使用默认会话,张量可以直接使用eval函数计算值:

结果如下:

如果使用函数获取会话,则需要手动指定会话为默认会话。为了合并这个过程,tf 设计了一个函数。此函数指定的会话是默认会话。

sess2 = tf.InteractiveSession()
print(result.eval())
sess2.close()

实验结果

这两个函数都可以用来配置会话运行配置。他可以配置并行线程数、GPU分配策略、操作超时等参数。两个最重要的参数是:

1. :通常设置为 True。当 GPU 无法支持某些操作时,它们会自动调整到 CPU。

2. :测试环境设置为True,生产环境设置为False。用于记录设备上各个节点的位置。

3.4 实现神经网络

3.4.1 和神经网络简介

游乐场网址:

没什么特别的,就是能直观感受一下神经网络的建模能力。

3.4.2 前向传播算法简介

一个神经元对应多个输入和一个输出。不同输入的权重是神经元的参数。神经网络的优化过程就是优化神经元中参数值的过程。

前向传播需要三条信息: 1. 神经网络的输入是从实体中提取的特征向量。 2. 神经网络的连接结构。神经网络中的神经元简称为节点。 3. 每个节点的参数。

前向传播算法只是简单的矩阵乘法,所以可以用函数来实现。

a = tf.matmul(x, w1)
y = tf.matmul(a, w2)

3.4.3 神经网络参数和变量

变量(tf.)用于保存和更新神经网络结构中的参数。变量需要指定一个初始值。通常,变量的初始值是随机分配的。

变量的典型定义:

weight = tf.Variable(tf.random_normal([2, 3], stddev=2))

典型的随机函数是:

1. :正态分布,默认均值为0,可以用均值指定均值

2. : 正态分布,但如果一个数字偏离平均值两个标准差,它将被重置为随机数

3. : 均匀分布

4. : 伽玛分布

变量也可以指定为常量:

1. 个:值为 1

2. 零:值为 0

3. 填充:值为指定的数字。如tf.fill([2,3],9)表示一个2*3的矩阵,值为9

4. :指定值的常量。如 tf.([ 1,2]) 表示 [1,2]

也可以使用其他参数的初始值作为变量的初始值:

w2 = tf.Variable(weight.initialized_value())

利用变量的定义,我们可以得到前向传播的代码:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
# define two variable and set the seed to keep the same result
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
# set the test input tensor
x = tf.constant([[0.7, 0.9]])
# forward process
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
# run with session
with tf.Session() as sess:
    sess.run(w1.initializer)
    sess.run(w2.initializer)
    print(sess.run(y))

实验结果:

实际程序中会有很多变量,所有参数都可以用tf.ble函数初始化。

在构建机器学习模型的时候,可以通过参数来区分参数是否需要优化,将真正的变量加入集合中。

维度和类型也是变量的两个重要属性。但是对于变量,维度是变量,只需要设置=False。类型是不可变的。

3.4.4 通过训练一个神经网络模型

输入数据由下式给出。仅定义数据 数据的类型来源于输入数据。中的数据由来源指定。

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
# define two variable and set the seed to keep the same result
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
x = tf.placeholder(tf.float32, shape=[1, 2], name="input")
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
with tf.Session() as sess:
    init_op = tf.initialize_all_variables()
    sess.run(init_op)
    print(sess.run(y, feed_dict={x: [[0.7, 0.9]]}))

实验结果:

要达到批处理的效果,只需要将数据中的数据转换成多维数据即可。

神经网络模型训练有两个非常重要的内容是损失和。目前主要支持7种,其中Adam是最常用的一种。

# loss function
cross_entropy = -tf.reduce_mean(y_*tf.log(tf.clip_by_value(y, 1e-10, 1.0)))
# optimizer
learning_rate = 0.0001
train_step = tf.train_AdamOptimizer(learning_rate).minimize(cross_entropy)

3.4.@ >5 完整的神经网络示例程序

© 版权声明
THE END
喜欢就支持一下吧
点赞7赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容