educoder 练习答案 TensorFlow技术与平台应用

1、TensorFlow初体验

一、起源

  1. 机器学习作为如今全球最为热门的计算机技术之一,可以让人们根据大量的数据来对未来的情况进行预测和判定。如今,全球科技巨头无不在在机器学习领域投入了大量的人力物力。Facebook,苹果,微软,百度,阿里巴巴,腾讯等行业巨擘无不参与其中。作为行业的领头羊 Google 公司自然也在其中。TensorFlow是 Google 多年以来内部开发建设的机器学习系统,并于2015 年面向全球进行了开源。
    TensorFlow

  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 实例。
    一般而言,Tensor的维度或者阶数要看张量的最左边有多少个左中括号,有n个,则这个张量就是n维张量,或者n阶张量。
    TensorFlow的运算一般分为两个阶段:1.定义计算图中的所有计算,2.执行计算(会话Session

四、实现流程

  1. TensorFlow 程序通常被分成两个阶段:构建阶段和执行阶段。 在构建阶段,op 的执行步骤被描述成一个图。在执行阶段,使用会话机制执行图中的 op;
  2. 例如,通常在构建阶段创建一个图来表示和训练神经网络,然后在执行阶段反复执行图中的训练 op。
    执行会话(Session)
    会话用来执行定义好的计算。会话可以调用和管理TF的所有资源。会话用完后需要关闭释放资源。
    会话的模式有两种:


第一种、显式调用会话生成函数和关闭会话函数。

#创建一个会话
sess = tf.Session()
#运行会话得到计算结果
sess.run(result)
#关闭会话,释放资源
sess.close()

第二种:运用上下文管理器来使用会话
with tf.Session() as session:
    session.run(result)
  

五、 实验

第1关变量创建和初始化

任务描述
新建一个名为 weights 的 Tensor 变量,里面的变量名为 big_weights,并进行初始化。

相关知识
当训练模型时,用变量来存储和更新参数。变量包含张量 (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.global_variables_initializer() 添加一个操作,对变量做初始化。记得在完全构建好模型并加载之后,再运行那个操作。如下是代码展示:

# 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.global_variables_initializer()
# Later, when launching the model
with tf.Session() as sess:
  # Run the init operation.
     sess.run(init_op)
  ...
  # Use the model

用另一个变量初始化
我们有时候会需要用另一个变量的初始化值,给当前变量初始化。由于 tf.global_variables_initializer() 是并行地初始化所有变量,所以在有这种需求的情况下,我们需要尤其小心;
用其它变量的值初始化一个新的变量时,使用其它变量的 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")

(1)编程要求
在右侧编辑器 Begin-End 区间补充代码,新建一个名为 weights 的 Tensor 变量,里面的变量名为 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")
    # ********** End **********#
    # 返回weights
    return weights

第2关变量保存

任务描述
学习如何保存模型的变量。

相关知识
保存和加载
最简单的保存和恢复模型的方法是,使用 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

(2)编程要求
在右侧编辑器 Begin-End 区间补充代码,新建 tf.train.Saver() 对象和 tf.Session() 对象,并进行初始化,将 tf.Session() 对象保存,保存路径为save_dir/store.ckpt。不要增删改本关的原有代码。
####测试说明

# -*- 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)
    save_path=saver.save(sess,'save_dir/store.ckpt')
    # ********** End **********#

    sess.close()

第3关变量恢复

任务描述
学习如何恢复模型。

相关知识
保存和加载

最简单的保存和恢复模型的方法是,使用 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 字典,很容易地定义需要保存的变量及对应名称:键对应使用的名称,值对应被管理的变量。

(3)编程要求
在右侧编辑器 Begin-End 区间补充代码,新建 tf.train.Saver() 对象,恢复模型,模型路径为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

第4关占位符使用–简单乘法实现

任务描述
学习如何使用占位符。

相关知识
占位符
在 Tensorflow 中,有时候我们并不清楚具体的输入数值,但我们在图中可以先占据一个位置。这就是所谓的占位符。

input1 = tf.placeholder("float", shape=[1, 2])
input2 = tf.placeholder("float", shape=[2, 1])

这里的 input1 和 input2 并不是特定的值,相反,他们都只是一个占位符,可以在 TensorFlow 运行某一计算时,根据该占位符输入具体的值。input1 和 input2 都是一个 2 维的浮点数张量。

feed_dic

我们该如何给占位符传入具体的参数呢? 答案很简单:启动图后,使用 feed_dict 参数,将数据传入 sess.run() 函数。

sess.run(product,feed_dict={
   input1:[[1,3],input2:[[1],[2]]})

矩阵乘法实现
在 Tensorflow 中,矩阵相乘较为简单,如下所示:

tf.matmul(input1,input2)

在一个会话中启动图
构造阶段完成后,我们才能启动图。 启动图的第一步是,创建一个 Session 对象,如果无任何创建参数,会话构造器将启动默认图。

启动默认图.

sess = tf.Session()

#调用 sess 的 'run()' 方法来执行矩阵乘法 op, 传入 'product' 作为该方法的参数. 
#上面提到, 'product' 代表了矩阵乘法 op 的输出, 传入它是向方法表明, 我们希望取回
#矩阵乘法 op 的输出.
#整个执行过程是自动化的, 会话负责传递 op 所需的全部输入. op 通常是并发执行的.
#函数调用 'run(product)' 触发了图中三个 op (两个常量 op 和一个矩阵乘法 op) 的执行.
# 返回值 'result' 是一个 numpy `ndarray` 对象.
product=tf.matmul(input1,input2)
result=sess.run(product,feed_dict={
   input1:[[1,3]],input2:[[1],[2]]})
print result
# ==> [[ 12.]]
# 任务完成, 关闭会话.
sess.close()

Session 对象

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值