欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【TensorFlow】 tensorflow基础学习1

程序员文章站 2022-07-07 11:58:42
...

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个或多个函数上,通过这种方式,用户可以利用多块更小的,更易于理解的数学函数对数据进行转化。

【TensorFlow】 tensorflow基础学习1

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

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

【TensorFlow】 tensorflow基础学习1

图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")

前面是用常量作为输入,这里我们用张量测试一下。

【TensorFlow】 tensorflow基础学习1

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