练习与转载于:https://educoder.trustie.net/shixuns/68rqajhy/challenges
TensorFlow
1. 机器学习作为如今全球最为热门的计算机技术之一,可以让人们根据大量的数据来对未来的情况进行预测和判定。如今,全球科技巨头无不在在机器学习领域投入了大量的人力物力。Facebook,苹果,微软,百度,阿里巴巴,腾讯等行业巨擘无不参与其中。作为行业的领头羊Google公司自然也在其中。TensorFlow是 Google 多年以来内部开发建设的机器学习系统,并于2015年面向全球进行了开源。
2. TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从流图的一端流动到另一端计算过程。TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统,可被用于语音识别、图像识别和文本处理等多项深度学习应用领域。
3. TensorFlow可以在CPU和GPU指令系统上运行,在操作系统方面,TensorFlow支持64位的Linux、MacOS、Windows和移动平台Andriod和iOS。
4. 截止到2017年九月TensorFlow 支持 C, C++, Python 编程语言。目前,TensorFlow 的 Python 库更加易用,它提供了大量的辅助函数来简化构建图的工作,这些函数尚未被 C 和 C++ 库支持。但三种语言的会话库 (session libraries) 是一致的。本实训是基于 Python 语言开展的。
在使用 TensorFlow,我们必须明白 TensorFlow 的5点特性:
1. 使用图 (graph) 来表示计算任务;
2. 在被称之为会话 (session) 的上下文 (context) 中执行图;
3. 使用 tensor 表示数据;
4. 通过变量 (variable) 维护状态;
5. 使用 feed 和 fetch 可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据。
基本框架
1. TensorFlow 是一个编程系统, 使用图来表示计算任务。 图中的节点被称之为 op (operation 的缩写)。一个 op 获得 0 个或多个 Tensor, 然后执行计算,结果是产生 0 个或多个 Tensor。 每个 Tensor 是一个类型化的多维数组。 例如, 你可以将一小组图像集表示为一个四维浮点数数组, 这四个维度分别是 [batch, height, width, channels]。
2. 一个 TensorFlow 图描述了计算的过程。 为了进行计算, 图必须在会话里被启动。会话将图的op分发到诸如 CPU 或 GPU 之类的设备上,同时提供执行 op 的方法。这些方法执行后,将产生的 tensor 返回。 在 Python 语言中, 返回的 tensor 是 numpy ndarray 对象; 在 C 和 C++ 语言中,返回的 tensor 是 tensorflow::Tensor 实例。
实现流程
1. TensorFlow 程序通常被分成两个阶段:构建阶段和执行阶段。 在构建阶段,op 的执行步骤被描述成一个图。在执行阶段,使用会话机制执行图中的op。
2. 例如,通常在构建阶段创建一个图来表示和训练神经网络,然后在执行阶段反复执行图中的训练 op。
实训目的
本实训项目的主要目标是使同学们掌握TensorFlow的基本用法,从而初步学会应用目前最为流行的开源框架开展机器学习工作。
一、变量创建和初始化
相关知识
当训练模型时,用变量来存储和更新参数。变量包含张量 (Tensor)存放于内存的缓存区。建模时它们需要被明确地初始化,模型训练后它们必须被存储到磁盘。这些变量的值可在之后模型训练和分析是被加载。
本关卡描述以下TensorFlow类。
- tf.Variable 类
当创建一个变量时,你将一个张量作为初始值传入构造函数Variable()。TensorFlow提供了一系列操作符来初始化张量,初始值是常量或是随机值。
我们需要指定操作符张量的shape。变量的shape通常是固定的,但TensorFlow提供了高级的机制用来重新调整其行列数。
# Create two variables.
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35), name="weights")
biases = tf.Variable(tf.zeros([200]), name="biases")
调用tf.Variable()添加一些操作(Op, operation)到graph:
- 一个Variable操作存放变量的值;
- 一个初始化op将变量设置为初始值,这事实上是一个tf.assign操作;
- 初始值的操作,例如示例中对biases变量的zeros操作也被加入了graph。
tf.Variable的返回值是Python的tf.Variable类的一个实例。
- 变量的初始化必须在模型的其它操作运行之前先明确地完成。最简单的方法就是添加一个给所有变量初始化的操作,并在使用模型之前首先运行那个操作。
- 使用tf.initialize_all_variables()添加一个操作对变量做初始化。记得在完全构建好模型并加载之后再运行那个操作。如下是代码展示:
# Create two variables.
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35), name="weights")
biases = tf.Variable(tf.zeros([200]), name="biases")
...
# Add an op to initialize the variables.
init_op = tf.initialize_all_variables()
# Later, when launching the model
with tf.Session() as sess:
# Run the init operation.
sess.run(init_op)
...
# Use the model
- 我们有时候会需要用另一个变量的初始化值给当前变量初始化。由于tf.initialize_all_variables()是并行地初始化所有变量,所以在有这种需求的情况下我们需要尤其小心。
- 用其它变量的值初始化一个新的变量时,使用其它变量的initialized_value()属性。我们可以直接把已初始化的值作为新变量的初始值,或者把它当做tensor计算得到一个值赋予新变量。如下是代码展示
# Create a variable with a random value.
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
name="weights")
# Create another variable with the same value as 'weights'.
w2 = tf.Variable(weights.initialized_value(), name="w2")
# Create another variable with twice the value of 'weights'
w_twice = tf.Variable(weights.initialized_value() * 0.2, name="w_twice")
新建一个名为weights的Tensor变量,里面的变量名为big_weights,并进行初始化
请将代码填至指定区域,
不要增删改本关的原有代码。
如果答案正确,则会输出 big_weights。
代码
# -*- coding: utf-8 -*-
import tensorflow as tf
def variables_create():
'''
返回值:
weights: 一个Tensor变量
'''
# 请在此添加代码 完成本关任务
# ********** Begin *********#
weights = tf.Variable(tf.random_normal([784,200],stddev=0.35),name="big_weights")
init_op=tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init_op)
# ********** End **********#
# 返回weights
return weights
二、变量的保存
相关知识
保存和加载
最简单的保存和恢复模型的方法是使用tf.train.Saver对象。tf.train.Saver对象可以有效地保存(save)和恢复(restore)变量。Saver对象并且提供了方法来运行节点(ops),并定义了检查点文件的读写路径。
检查点文件
变量存储在二进制文件里,里面内容主要包含从变量名到tensor值的映射关系。当我们创建一个Saver对象时,我们可以选择性地为检查点文件中的变量挑选变量名。默认情况下,变量名为每个变量 Variable.name 属性的值。
保存变量
TensorFlow用tf.train.Saver()创建一个Saver,从而用来管理模型中的所有变量。代码示例如下:
# Create some variables.
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
...
# Add an op to initialize the variables.
init_op = tf.initialize_all_variables()
# Add ops to save and restore all the variables.
saver = tf.train.Saver()
# Later, launch the model, initialize the variables, do some work, save the
# variables to disk.
with tf.Session() as sess:
sess.run(init_op)
# Do some work with the model.
..
# Save the variables to disk.
save_path = saver.save(sess, "/tmp/model.ckpt")
print "Model saved in file: ", save_path
任务描述
将模型的变量保存至 save_dir/store.ckpt中。
编程要求
请将代码填至指定区域,
不要增删改本关的原有代码。
测试说明
如果操作正确,系统会输出 True。
代码
# -*- coding: utf-8 -*-
import tensorflow as tf
import time
def variables_save():
'''
参数:
weights: Tensor变量
biase: Tensor变量
const123:Tensor变量
'''
weights=tf.Variable(tf.random_normal([784,200]),name="weights")
biase=tf.Variable(tf.zeros([1]),name='biases')
const123=tf.Variable(([[3]]),name="jjdaren")
init_op=tf.global_variables_initializer()
sess=tf.Session()
# 请在此添加代码 完成本关任务
# ********** Begin *********#
saver = tf.train.Saver()
sess.run(init_op)
saver.save(sess,"save_dir/store.ckpt")
# ********** End **********#
sess.close()
三、变量恢复
相关知识
保存和加载
最简单的保存和恢复模型的方法是使用tf.train.Saver对象。tf.train.Saver对象可以有效地保存(save)和恢复(restore)变量。Saver对象并且提供了方法来运行节点(ops),并定义了检查点文件的读写路径。
检查点文件
变量存储在二进制文件里,里面内容主要包含从变量名到tensor值的映射关系。当我们创建一个Saver对象时,我们可以选择性地为检查点文件中的变量挑选变量名。默认情况下,变量名为每个变量 Variable.name 属性的值。
恢复变量
用同一个Saver对象来恢复变量。注意,当我们从文件中恢复变量时,不需要事先对它们做初始化。
# Create some variables.
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
...
# Add ops to save and restore all the variables.
saver = tf.train.Saver()
# Later, launch the model, use the saver to restore variables from disk, and
# do some work with the model.
with tf.Session() as sess:
# Restore variables from disk.
saver.restore(sess, "/tmp/model.ckpt")
print "Model restored."
# Do some work with the model
...
选择存储和恢复哪些变量
如果我们不给tf.train.Saver()传入任何参数,那么Saver将处理图 (graph) 中的所有变量。其中每一个变量都以变量创建时传入的名称被保存。在检查点文件中明确定义变量的名称是很有用的。
有时候仅保存和恢复模型的一部分变量很有用。再举个例子,我们也许训练得到了一个5层神经网络,现在想训练一个6层的新模型,可以将之前5层模型的参数导入到新模型的前5层中。我们可以通过给tf.train.Saver()构造函数传入Python字典,很容易地定义需要保持的变量及对应名称:键对应使用的名称,值对应被管理的变量。
任务描述
恢复存储在src/step3/save_dir1/store.ckpt的模型。
编程要求
请将代码填至指定区域,
不要增删改本关的原有代码。
测试说明
如果操作正确,系统会输出正确答案。
代码
# -*- coding: utf-8 -*-
import tensorflow as tf
import time
def variable_restore():
'''
参数:
const123:Tensor变量
返回值:
final_result: 一个Tensor类型变量
'''
const123 = tf.Variable(([[2]]), name="jjdaren")
sess=tf.Session()
# 请在此添加代码 完成本关任务
# ********** Begin *********#
saver = tf.train.Saver()
saver.restore(sess,"src/step3/save_dir1/store.ckpt")
# ********** End **********#
final_result=sess.run(const123)
sess.close()
#返回 final_result
return final_result
四、占位符使用--简单乘法实现