tensorflow 学习 一

一. 计算图 graph

计算图,又称有向图,数据流图。描述了张量数据的计算流程,负责维护和更新状态,对分支进行条件控制和循环操作。
数据流图:用节点和线 的有向图来描述数学计算。
节点:施加的数学计算 或 数据输入的起点 或 输出的终点 或 读写持久变量的终点
线:表示节点间的输入输出关系,运输着size可动态调整的多维数据数组(张量)

一旦输入端的所有张量准备好,节点将分配到各种计算设备中完成异步并行地执行运算
Tensorflow : 张量从图中流过的直观图像
有一类特殊的边中没有数据流动 - 依赖控制
作用:控制节点的执行顺序,让起始节点执行完毕再去执行目标节点,用户可以使用这样的边 进行灵活控制,比如限制内存使用的最高峰值
这里写图片描述

二. 张量 tensor

TensorFlow 将张量表现为基本数据类型的 n 维数组。零阶张量表示标量,一阶张量表示向量,以此类推。但在张量中,并没有保存真正的数字,而是保存如何得到这些数字的计算过程。

一个张量中主要保存了三个属性:名字、维度、类型
张量的第一个属性名字不仅是张量的唯一标识符,也给出了张量是如何计算出来的,通过”node:src_output”的形式给出,node为结点名称,src_output表示当前张量来自节点的第几个输出。第二个属性是维度。第三个属性是类型,每个张量的类型是唯一的,发现类型不匹配时会报错。

三. 常量constant 创建

import tensorflow as tf
a = tf.constant([1.0,2.0], name="a")
b = tf.constant([2.0,3.0], name="b")
word=tf.constant('hello,world!')      
result = tf.add(a,b, name="add")
print word
print result
#输出
#Tensor("Const:0", shape=(), dtype=string)
#Tensor("add:0", shape(2,), dtype=float32)

比如:
a=tf.constant(10)  #定义一个tf 的常量a
a = 10     #定义了一个值为10的常量a
  区别是:下面可以用print(a) 直接打印。
        上面则需要通过Session run(result)后才能得到值

对于tf 创建的常量或变量,都需要会话run 后才能有值,否则打印出来的是属性

四. 变量Variable 创建

当训练模型时,用变量来存储和更新参数。变量包含张量存放于内存的缓存区中。
建模时他们需要被明确地初始化,模型训练 tf.global_variables_initializer()后他们必须被存储到磁盘。这些变量的值可在之后模型训练和分析时被加载。

创建:当创建一个变量时,需将一个张量作为初始值传入构造函数Variable().同时Tensorflow提供了一系列操作符来初始化张量(常量或是随机值)
eg: #create two variables.
weights = tf.Variable(tf.random_normal([2,3]), stddv=0.35, name=”weights”)
//创建初始值为0的1维数组,长度为200
biases = tf.Variable(tf.zeros([200]), name=”biases”);

a = tf.Variable(tf.ones([3,3])) # 定义初始值都为1 的 3x3矩阵
b = tf.Variable(tf.zeros([3,3])) # 定义初始值都为0 的3x3矩阵

import tensorflow as tf
import numpy as np

y = np.array([[1,1],[2,2]])
x = [[1,1],[2,2]]
a = tf.Variable(initial_value = x)
b = tf.Variable(y)

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

print(sess.run(a))
print(sess.run(b))
sess.close()

注:这些操作符都需要指定张量的shape,并且自动成为变量的shape.
变量的shape 通常是固定的,但tensorflow 提供的高级的机制来重新调整其行列数。

扫描二维码关注公众号,回复: 1866760 查看本文章

1.变量Variable 初始化

(1). 一次性全部初始化
变量的初始化必须在模型的其他操作运行之前先明确完成。

init = tf.initialize_all_variables(); //已被替换
init = tf.global_variables_initializer()
#启动图(graph)
sess = tf.Session()
sess.run(init)

(2). 也可以传入一组变量进行初始化

(3). 使用一个变量的初始值给另一个变量赋值
有此需求的,则要注意第一种情况
通过节点的initialized_value()属性,直接把已初始化的值作为另一个变量的初始值
biases = tf.Variable(tf.zeros([200]), name=”biases”); //创建初始值为0的1维数组,长度为200
otherBia = tf.Variable(biases.initialized_value(), name=”otherBia”)

2.变量Variable 保存和恢复

保存和加载

比如停电等操作使得模型运算停止了,此时就需要保存和恢复模型。
构造器给graph的所有变量,或者定义在列表的变量,添加save 和 restore 操作。saver对象提供了方法来运行这些操作,定义检查点文件的读写路径

检查点文件

变量存储在二进制文件里,主要包含从变量名到tensor值的映射关系
当创建一个Saver对象时,可以选择性地为检查点文件中的变量挑选变量名。默认情况下,将变量Variable.name属性的值

保存变量

用tf.train.Saver() 创建一个Saver来管理模型中的所有变量

#创建一些变量
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
#添加一个初始化操作初始化前面定义的所有变量
init_op = tf.global_variables_initializer()
#添加Saver操作对变量进行保存和恢复
saver = tf.train.Saver()
#启动会话
with tf.Session() as sess:
#运行初始化节点
//所有的tf.Variable 实例都会调用各自的run方法进行初始化
sess.run(init_op)     
#do some thing
#将变量的值保存在硬盘里
save_path = saver.save(sess, "/temp/model.ckpt")
print "Model saved in file: ", save_path

恢复变量

#创建一些变量
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
#添加一个初始化操作初始化前面定义的所有变量
init_op = tf.global_variables_initializer()
#添加Saver操作对变量进行保存和恢复
saver = tf.train.Saver()
#启动会话
with tf.Session() as sess:
#从硬盘里面读取检查点文件并恢复到对应的变量中
saver.restore(sess, "/temp/model.ckpt")
print "Model restored."
# 在已经重新恢复的模型上继续工作

保存和恢复某些变量

#保存变量
saver = tf.train.Saver({“my_v2”: v2}) 通过键值对来链接(Python 字典)

五. 会话Session: 创建和运行

要评估张量,需要实例化一个 tf.Session 对象(通常被称为会话)。会话会封装 TensorFlow 运行时的状态,并运行 TensorFlow 指令。
运行张量计算。 (完成后需要关闭会话,防止出现资源泄露)
当使用 Session.run 请求输出节点时,TensorFlow 会回溯整个图,并流经提供了所请求的输出节点对应的输入值的所有节点。
sess = tf.Session()

with tf.Session() as sess:

sess.run(…)#使用这个创建好的会话得到关心的运算结果,
比如可以sess.run(result)来得到张量result的值
第一种需要sess.close()#会话使用完毕之后要关闭会话保证资源不被泄露

完成变量的初始化后,可以开始训练。
训练的每一步都是通过用户代码控制,而能实现有效的训练最简单的循环:

for step in xrange(0, 201):
    sess.run(train) #运行计算图
        if step % 20 == 0
           print step, sess.run(W), sess.run(b)  打印值
ps:
   vec = tf.random_uniform(shape=(3,))
   out1 = vec + 1
   out2 = vec + 2
   print(sess.run(vec))
   print(sess.run(vec))
   print(sess.run((out1, out2)))
   每次调用 run 时,结果都会显示不同的随机值,
   结果显示的值是一致的:

    [ 0.52917576  0.64076328  0.68353939]
    [ 0.66192627  0.89126778  0.06254101]
    (
      array([ 1.88408756,  1.87149239,  1.84057522], dtype=float32),
      array([ 2.88408756,  2.87149239,  2.84057522], dtype=float32)
    )

六. 占位符

变量在定义时要初始化,但是如果有些变量刚开始我们并不知道它们的值,无法初始化,那怎么办呢?
那就用占位符来占个位置,如:
x = tf.placeholder(tf.float32, [None, 784])
指定这个变量的类型和shape,以后再用feed的方式来输入值。

例如:

    x = tf.placeholder(tf.float32)
    y = tf.placeholder(tf.float32)
    z = x + y
   //前面三行有点像函数。我们定义了这个函数的两个输入参数(x 和 y),然后对它们运行指令。
   //我们可以使用 run 方法的 feed_dict 参数来为占位符提供真正的值,从而通过多个输入值来评估这个图:

   print(sess.run(z, feed_dict={x: 3, y: 4.5}))
   print(sess.run(z, feed_dict={x: [1, 3], y: [2, 4]}))
   //上述操作的结果是输出以下内容:
   7.5
   [ 3.  7.]
//另请注意,feed_dict 参数可用于覆盖图中的任何张量。
  占位符和其他 tf.Tensors 的唯一不同之处在于如果没有提供值给它们,那么占位符会显示错误。

七. 矩阵乘

满足矩阵相乘规则 m x n 与 n x y
比如:

import tensorflow as tf

a = tf.Variable([[1,2],[3,4],[5,6]]) #3 x 2矩阵
b = tf.Variable([[1,2],[3,4]])

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    print(sess.run(tf.matmul(a,b)))
运行结果如下:
[[ 7 10]
[15 22]
[23 34]]

八. 矩阵加减

一般为2个相同大小的矩阵,否则会报错
tf.add
tf.mul
比如:

import tensorflow as tf

a = [[10,10],[20,20]]
b = tf.Variable([[5,5],[10,10]])
c = tf.subtract(a,b)
init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    print(sess.run(tf.add(a,b)))
    print(sess.run(c))
    print(sess.run(tf.negative(a)))
结果如下:
[[15 15]
 [30 30]]
[[ 5  5]
 [10 10]]
[[-10 -10]
 [-20 -20]]

tf.mul tf.sub tf.neg 已经废弃
分别可用tf.multiply tf.subtract tf.negative替代
乘法 减法 取反

猜你喜欢

转载自blog.csdn.net/weixin_39158738/article/details/80845796