songbinxu 2019-12-08
首先,对于tensorflow来说,最重要的概念就是图(Graph)和会话(Session),tensorflow的计算思想是:以图的形式来表示模型,表示和计算分隔开。
这就是一个Data Flow Graph,最核心的就是定义和计算不等于执行,一个模型跑起来只需要两步:先描述整幅图,然后在session中执行运算。tensorflow==tensor + flow,tensor是张量,flow流动,可以理解为张量在图中通过上图所示里面的a,b,c,d,e这些运算(这里把他们叫做op)进行流动(传递和变换)。下面通过一个简单的实例看一下:
v1 = tf.constant([1,2,3]) v2 = tf.constant([4,5,6]) v3 = tf.add(v1, v2) print(v1) print(v2) print(v3) with tf.Session() as sess: print(sess.run(v3))
在上面,定义了两个常量类型的张量(后面会说)v1、v2,v3把v1、v2相加,然后通缩Seeion执行运算,看一下输出结果:
Tensor("Const:0", shape=(3,), dtype=int32) Tensor("Const_1:0", shape=(3,), dtype=int32) Tensor("Add:0", shape=(3,), dtype=int32) [5 7 9]
可以看到,此时的v3并不是我们想要的数据,而是一个张量,括号里面显示了张量的类型,形状,以及里面的数据类型。这就是上面说的tensorflow中计算定义和执行是分开的,要想得到结果就必须用session来执行运算,首先初始化session,然后调用run()方法来执行定义的v3这个运算,这样我们就可以输出结果了,经过run之后再次输出,此时的结果就是我们想要的数据[5 7 9]了。session在执行的时候会找到你让他执行的运算a的依赖,把依赖的节点都进行计算,不需要的节点则不用计算。
张量:可理解为一个 n 维矩阵,所有类型的数据,包括标量、矢量和矩阵等都是特殊类型的张量。
TensorFlow 支持以下三种类型的张量:
可以这样声明一个常量:
a = tf.constant(2, name="a") b = tf.constant(3, name="b") x = tf.add(a, b, name="add")
这里的name是为了在tensorboard中方便查看,至于tensorboard就是整个模型的图表示。
t_2 = tf.constant([4,3,2])
要创建一个所有元素为零的张量,可以使用 tf.zeros() 函数。这个语句可以创建一个形如 [M,N] 的零元素矩阵,数据类型(dtype)可以是 int32、float32 等:tf.zeros([M,N],tf.dtype)
例如:zero_t = tf.zeros([2,3],tf.int32) # Results in an 2x3 array of zeros:[[0 0 0],[0 0 0]]还可以创建与现有 Numpy 数组或张量常量具有相同形状的张量常量,如下所示:
tf.ones([M,N],tf,dtype)
例如:ones_t = tf.ones([2,3],tf.int32) # Results in an 2x3 array of ones:[[1 1 1],[1 1 1]]
tf.linspace(start,stop,num)
相应的值为 (stop-start)/(num-1)。例如:range_t = tf.linspace(2.0,5.0,5) #We get:[2. 2.75 3.5 4.25 5.]
tf.range(start,limit,delta)
下面给出实例:range_t = tf.range(10) #Result:[0 1 2 3 4 5 6 7 8 9]
tf.random_crop(t_random,[2,5],seed=12)
这里,t_random 是一个已经定义好的张量。这将导致随机从张量 t_random 中裁剪出一个大小为 [2,5] 的张量。tf.random_shuffle(t_random)
tf.set_random_seed(54)
TIP:种子只能有整数值。它们通过使用变量类来创建。变量的定义还包括应该初始化的常量/随机值。下面的代码中创建了两个不同的张量变量 t_a 和 t_b。两者将被初始化为形状为 [50,50] 的随机均匀分布,最小值=0,最大值=10:
注意:变量通常在神经网络中表示权重和偏置。
下面的代码中定义了两个变量的权重和偏置。权重变量使用正态分布随机初始化,均值为 0,标准差为 2,权重大小为 100×100。偏置由 100 个元素组成,每个元素初始化为 0。在这里也使用了可选参数名以给计算图中定义的变量命名:
在前面的例子中,都是利用一些常量来初始化变量,也可以指定一个变量来初始化另一个变量。下面的语句将利用前面定义的权重来初始化 weight2:
变量的定义将指定变量如何被初始化,但是必须显式初始化所有的声明变量。在计算图的定义中通过声明初始化操作对象来实现:
每个变量也可以在运行图中单独使用 tf.Variable.initializer 来初始化:
保存变量:使用 Saver 类来保存变量,定义一个 Saver 操作对象:
saver = tf.train.Saver()
输出变量内容会用到Eval()函数:
# W 是一个700 x 100 随机变量 W = tf.Variable(tf.truncated_normal([700, 10])) with tf.Session() as sess: sess.run(W.initializer) print(w) print(w.eval())>> Tensor("Variable/read:0", shape=(700, 10), dtype=float32) >> [[-0.76781619 -0.67020458......
可以使用下面的方法定义一个占位符:
tf.placeholder(dtype, shape = None, name = None)
通过一个例子看一下:
# create a placeholder of type float 32-bit, shape is a vector of 3 elements a = tf.placeholder(tf.float32, shape=[3]) # create a constant of type float 32-bit, shape is a vector of 3 elements b = tf.constant([5, 5, 5], tf.float32) # use the placeholder as you would a constant or a variable c=a+b #Shortfortf.add(a,b) with tf.Session() as sess: print sess.run(c)
上面这段程序会报错:# Error because a doesn’t have any value 对于a我们没有给任何数据,我们将代码修改为:
# create a placeholder of type float 32-bit, shape is a vector of 3 elements a = tf.placeholder(tf.float32, shape=[3]) # create a constant of type float 32-bit, shape is a vector of 3 elements b = tf.constant([5, 5, 5], tf.float32) # use the placeholder as you would a constant or a variable c=a+b #Shortfortf.add(a,b) with tf.Session() as sess: # feed [1, 2, 3] to placeholder a via the dict {a: [1, 2, 3]} print sess.run(c, {a: [1, 2, 3]}) # the tensor a is the key, not the string ‘a’ # >> [6, 7, 8]
我们通过字典的形式将数据传给placeholder,这是tensorflow中最普遍的方式
下面我们再看一个例子:先创建两个op
a = tf.add(2, 5) b = tf.mul(a, 3)
然后创建一个replace_dict来修改a的值:
with tf.Session() as sess: # define a dictionary that says to replace the value of ‘a‘ with 15 replace_dict = {a: 15} # Run the session, passing in ‘replace_dict‘ as the value to ‘feed_dict‘ sess.run(b, feed_dict=replace_dict) # returns 45
feed_dict是tensorflow中用于喂数据的方法,都以字典形式存入,就像上面这一段代码,feed_dict={a:15},那么就把b这个op中的a的值赋值为15。
文章参考:https://www.jianshu.com/p/f4cca870b893、http://c.biancheng.net/view/1885.html
***************不积跬步无以至千里***************