【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 引用自《tensorflow for machine intelligence》

上面这个图展示了一个最简单的加法运算,这个圆代表加法函数,有两个输入,1和2,由箭头指向这个函数,有一个输出结果3,用箭头从函数指向外部,这个输出结果可以再作为下一步函数的输入,也可以作为最终结果返回给客户端。
这个简单的例子里包含两个概念:节点和边

  • 节点: 一般会用圆形、椭圆形或者矩形描述,表示在整个图内会有一类关于数据的计算或者操作在此处完成,如上图中的圆形就是一个单独的节点
  • 边: 传递到操作(函数)中的实际的值,通常用箭头表示,上面例子中,1,2是输入节点的两个边,3是从节点输出的边,我们可以把边当作信息的载体,也是连接不同节点的 “链” 。

图2 引用自《tensorflow for machine intelligence》

图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

猜你喜欢

转载自blog.csdn.net/zuolixiangfisher/article/details/80431436