【TensorFlow】 tensorflow基础学习1
1、张量
张量是TensorFlow的主要数据结构,TensorFlow 基于张量管理,张量是数学领域的概念,可以理解为向量或者矩阵的泛化形式。在TF中,一个张量就是一个张量类的实例,是绑定了相关运算的一个特定类型的多维数组。
1.1 张量的属性
(1) 阶
阶 | 数学实体 | 代码示例 |
---|---|---|
0 | Scalar(纯量) | scalar=1000 |
1 | Vector(向量) | vector=[2,8,3] |
2 | Matrix(矩阵) | matrix=[[4,2,1],[5,3,2],[5,5,6]] |
3 | 3-tensor(立方体) | tensor=[[[4], [3], [2]], [[5], [2], [1]], [[8], [1], [12]]] |
n | n-tensor(n阶张量) | … |
由上面的表格可以看到,张量的阶其实就是纯量叠加的次数,
向量=[纯量1,纯量2,…,纯量n], 叠加一次
矩阵=[向量1,向量2,…,向量k]=[[纯量11,纯量12,…,纯量1n],…,[纯量k1,纯量k2,…,纯量kn]],叠加两次
(2) 形状
张量的形状代表的是张量每一个阶的元素个数。例如二阶张量[[1,2,3],[4,5,6]] 的形状就是 [2, 3],可以看到这个二阶张量(矩阵)的形状[2, 3]表示的是包含2个一阶张量,每个一阶张量包含3个0阶张量。
阶 | 形状 | 维数 | 例子 |
---|---|---|---|
0 | [] | 0-D | 4 |
1 | [D0] | 1-D | [2] |
2 | [D0, D1] | 2-D | [6, 2] |
3 | [D0,D1,D2] | 3-D | [7,3,2] |
n | [D0,D1,D2,…,Dn-1] | n-D | 形状为[D0,D1,D2,…,Dn-1]的张量 |
(3) 数据类型
数据类型 | python类型 | 描述 |
---|---|---|
DT_FLOAT | tf.float32 | 32位浮点型 |
DT_DOUBLE | tf.float64 | 64位浮点型 |
DT_INT8 | tf.int8 | 8位有符号整型 |
DT_INT16 | tf.int16 | 16位有符号整型 |
DT_INT32 | tf.int32 | 32位有符号整型 |
DT_INT64 | tf.int64 | 64位有符号整型 |
DT_STRING | tf.string | 可变长度的字节数组,每一个张量元素都是一个字节数组 |
DT_BOOL | tf.bool | 布尔型 |
1.2 创建新张量
我们既可以直接创建,也可以从numpy库中继承。
import tensorflow as tf
import numpy as np
x = tf.constant(np.random.rand(32).astype(np.float32))
y = tf.constant([1,2,3])
numpy数组和tensorflow张量可以互相操作
import tensorflow as tf
import numpy as np
x_data = np.array([[1.,2.,3.],[3.,2.,6.]])
x = tf.convert_to_tensor(x_data, dtype=tf.float32)
2、图基础知识
每一个tensorflow程序的核心是代码里描述的计算图,一个计算图是一种特殊类型的有向图,用来定义确定的计算结构。tensorflow,本质上是一系列函数链接在一起,每一次运行沿着链把它的输出给到更远的0个,1个或多个函数上,通过这种方式,用户可以利用多块更小的,更易于理解的数学函数对数据进行转化。
上面这个图展示了一个最简单的加法运算,这个圆代表加法函数,有两个输入,1和2,由箭头指向这个函数,有一个输出结果3,用箭头从函数指向外部,这个输出结果可以再作为下一步函数的输入,也可以作为最终结果返回给客户端。
这个简单的例子里包含两个概念:节点和边
- 节点: 一般会用圆形、椭圆形或者矩形描述,表示在整个图内会有一类关于数据的计算或者操作在此处完成,如上图中的圆形就是一个单独的节点
- 边: 传递到操作(函数)中的实际的值,通常用箭头表示,上面例子中,1,2是输入节点的两个边,3是从节点输出的边,我们可以把边当作信息的载体,也是连接不同节点的 “链” 。
图2 是稍微复杂的计算图。废话不多说,直接上代码
import tensorflow as tf
# 这里 tf.constant() 是tensorflow的一个Operation,简称 Op
# 在TF 里,任何的计算节点都称为 Operation
a = tf.constant(5, name="input_a")
b = tf.constant(3, name="input_b")
# c, d 两个节点是由之前定义的 a,b两个节点作为输入
c = tf.multiply(a, b, name="mul_c")
d = tf.add(a, b, name="add_d")
e = tf.add(c, d, name="acc_e")
前面是用常量作为输入,这里我们用张量测试一下。
import tensorflow as tf
a = tf.constant([5,3], name='input_a')
b = tf.reduce_prob(a, name='prob_b')
c = tf.reduce_sum(a, name='sum_c')
d = tf.add(b, c, name='add_d')
sess = tf.Session()
sess.run(b)
2.1 Graph
到目前为止,我们只是把“图”作为TF中某种抽象的,全方位的存在。我们并没有问为什么在写代码的时候这些 Ops 是如何自动加载到图里的,接下来看一些例子,来学习如何创建图,如何使用多图互相结合。
import tensorflow as tf
# create a new graph:
g = tf.Graph()
一旦图被初始化,我们就可以利用 as_default() 方法往图里添加Ops
import tensorflow as tf
# create a new graph:
g = tf.Graph()
with g.as_default():
# create operation as usual ,they will be added to graph g
a = tf.multiply(2, 3)
你可能会疑惑,为什么之前的Ops不需要这样添加到graph里?这是因为tensorflow在加载库的时候会自动的创建一个graph并将其设置为默认的graph,在Graph.as_default()上下文管理器之外定义的任何操作、张量等都将会自动放置在默认图形中:
import tensorflow as tf
# create a new graph:
g = tf.Graph()
# placed in default graph
in_default_graph = tf.add(1,2)
# placed in graph 'g'
with g.as_default():
a = tf.multiply(2, 3)
# we also no longer in with block ,so it is placed in default graph
also_in_default_graph = tf.sub(5,1)
可以使用 tf.get_default_graph()函数,获得默认图的句柄
default_graph = tf.get_default_graph()
正确的创建一个图,而不使用默认图
import tensorflow as tf
g1 = tf.get_default_graph()
g2 = tf.Graph()
with g1.as_default():
# Define g1 Operations, tensors, etc.
2.2 Session
运行TensorFLow操作(operations)的类,一个Session包含了操作对象执行的环境.
Session(会话)是负责 graph(图)执行的,其构造函数有三个参数
- target 指定要使用的引擎,默认值是空字符串
- graph 指定要加载的graph 对象,默认为None
- config 允许用户选择session的配置,例如限制CPU或者是GPU的使用数量,设置图中的优化参数、日志选项。在典型的tensorflow程序中,session对象的创建可以不需要修改任何默认参数。
import tensorflow as tf
a = tf.add(2,5)
b = tf.multiply(a, 3)
# start up a 'Session' using default graph
sess = tf.Session()
# 注意到下面两个sess 是不一样的
sess = tf.Session()
sess = tf.Session(graph=tf.get_default_graph())
sess.run(b) # return 21
Feed dictionary
import tensorflow as tf
a = tf.add(2,5)
b = tf.multiply(a, 3)
replace_dic = {a: 15}
sess = tf.Session()
sess.run(b, feed_dict=replace_dic) # return 45
sess.close() # close the graph, release the resources
# 这里可以用另一种方式,不需要手动加 sess.close()来释放资源
with tf.Session() as sess:
sess.run(b, feed_dict=replace_dic)
参考文献:
http://www.tensorfly.cn/
https://www.cnblogs.com/lienhua34/p/5998853.html