第 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 张量的使用
张量有两种用途:一种是作为中间计算结果的引用。另一种是计算图构建完成后,可以使用张量获取计算结果,得到实数。
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 完整的神经网络示例程序
暂无评论内容