tensorflow入门 - SUSTC-XLAB/crops GitHub Wiki
tensorflow编程模型简介
Tensorflow中的计算可以表示为一个有向图(directed graph),或称计算图(computation graph),其中每一个运算操作将作为一个节点(node),节点与节点之间的连接成为边(edge),而在计算图的边中流动(flow)的数据被称为张量(tensor),所以形象的看整个操作就好像数据(tensor)在计算图(computation graphy)中沿着边(edge)流过(flow)一个个节点(node),这就是tensorflow名字的由来的。
计算图中的每个节点可以有任意多个输入和任意多个输出,每个节点描述了一种运算操作(operation, op),节点可以算作运算操作的实例化(instance)。计算图描述了数据的计算流程,它也负责维护和更新状态,用户可以对计算图的分支进行条件控制或循环操作。用户可以使用pyton、C++、Go、Java等语言设计计算图。tensorflow通过计算图将所有的运算操作全部运行在python外面,比如通过c++运行在cpu或通过cuda运行在gpu 上,所以实际上python只是一种接口,真正的核心计算过程还是在底层采用c++或cuda在cpu或gpu上运行。
一个 TensorFlow图描述了计算的过程. 为了进行计算, 图必须在会话(session)里被启动. 会话将图的op分发到诸如CPU或GPU之的备上, 同时提供执行op的方法. 这些方法执行后, 将产生的tensor返回. 在Python语言中, 返回的tensor是numpy ndarray对象; 在C和C++语言中, 返回的tensor是tensorflow::Tensor实例。
从上面的描述中我们可以看到,tensorflow的几个比较重要的概念:tensor, computation graphy, node, session。正如前面所说,整个操作就好像数据(tensor)在计算图(computation graphy)中沿着边(edge)流过(flow)一个个节点(node),然后通过会话(session)启动计算。所以简单来说,要完成这整个过程,我们需要的东西是要定义数据、计算图和计算图上的节点,以及启动计算的会话。所以在实际使用中我们要做的大部分工作应该就是定义这些内容了。
tensorflow基本概念
下面简单介绍下tensorflow的基本概念
张量
张量就是多维数组(列表),用“阶”表示张量的维度。
0 阶张量称作标量,表示一个单独的数;
举例 S=123
1 阶张量称作向量,表示一个一维数组;
举例 V=[1,2,3]
2 阶张量称作矩阵,表示一个二维数组,它可以有 i 行 j 列个元素,每个元素可以用行号和列号共同索引到;
举例 m=[1, 2, 3], [4, 5, 6], 7, 8, 9
判断张量是几阶的,就通过张量右边的方括号数,0 个是 0 阶,n 个是 n 阶,张量可以表示 0 阶到 n 阶数组(列表);
举例 t=[ [ [… ] ] ]为 3 阶。
数据类型
Tensorflow 的数据类型有 tf.float32、tf.int32 等。
举例
我们实现 Tensorflow 的加法:
import tensorflow as tf #引入模块
a = tf.constant([1.0, 2.0]) #定义一个张量等于[1.0,2.0]
b = tf.constant([3.0, 4.0]) #定义一个张量等于[3.0,4.0]
result = a+b #实现 a 加 b 的加法
print result #打印出结果
可以打印出这样一句话:Tensor(“add:0”, shape=(2, ), dtype=float32),意思为 result 是一个名称为 add:0 的张量,shape=(2,)表示一维数组长度为 2,dtype=float32 表示数据类型为浮点型。
在tensorflow里有一类数据比较特殊,那就是我们需要在整个计算图执行过程中需要保存的状态。比如我们在进行神经网络训练时要时刻保存并更新的网络参数,这时我们就需要用到Varibale来保存这些参数。其实,我们在前面的示例中已经用到了变量的定义了,它的定义关键字为Variable,如x = tf.Variable([1.0, 2.0])。
计算图(computation graphy)
计算图指搭建神经网络的计算过程,是承载一个或多个计算节点的一张图,只搭建网络,不运算。
计算图是由一个个节点和连接各个节点的边组成,因此要定义一个计算图,只需要定义好各个节点以及节点的输入输出(对应计算图的边)。节点代表各种操作,如加法、乘法、卷积运算等等,输入输出主要是各种数据(tensor)。当然,我们也可以添加更多更复杂的操作(operation)的节点(node)到计算图(computation graphy)中,如果增加一些卷积网络节点、全连接网络节点等等就可以组建一个神经网络计算图了。
最简单的计算图如下所示:
x1、x2 表示输入,w1、w2 分别是 x1 到 y 和 x2 到 y 的权重,y=x1w1+x2w2。
我们实现上述计算图:
import tensorflow as tf #引入模块
x = tf.constant(1.0, 2.0) #定义一个 2 阶张量等于1.0,2.0
w = tf.constant([3.0], 4.0) #定义一个 2 阶张量等于[3.0],4.0
y = tf.matmul(x, w) #实现 xw 矩阵乘法
print y #打印出结果
可以打印出这样一句话:Tensor(“matmul:0”, shape(1,1), dtype=float32),从这里我们可以看出,print 的结果显示 y 是一个张量,只搭建承载计算过程的计算图,并没有运算,如果我们想得到运算结果就要用到“会话 Session()”了。
节点(node)
计算图中的每个节点可以有任意多个输入和任意多个输出,每个节点描述了一种运算操作(operation, op),节点可以算作运算操作的实例化(instance)。一种运算操作代表了一种类型的抽象运算,比如矩阵乘法货响亮加法。在tensorflow中,也可以通过注册机制加入新的运算操作或者运算核,这和torch上的注册机制类似。tensorflow内建了很多种运算操作,如下表所示:
会话(session)
会话是执行计算图中的节点运算。 正如我们前面所说,计算图里描述的计算并没有真正执行,只是进行了定义和描述,要实际执行我们就需要在会话(session)里被启动。这时session才会将计算图上的节点操作op分发到诸如CPU或GPU之类的设备上, 同时提供执行op的方法。这些方法执行后,将产生的tensor返回.要启动计算图,我们收下需要定义一个session对象,启动操作,最简单的就是调用函数run。
我们用 with 结构实现实现上面的计算图,语法如下:
with tf.Session() as sess:
print sess.run(y)
举例
对于刚刚所述计算图,我们执行 Session()会话可得到矩阵相乘结果:
import tensorflow as tf #引入模块
x = tf.constant(1.0, 2.0) #定义一个 2 阶张量等于 1.0,2.0
w = tf.constant([3.0], 4.0) #定义一个 2 阶张量等于[3.0],4.0
y = tf.matmul(x, w) #实现 xw 矩阵乘法
print y #打印出结果
with tf.Session() as sess: print sess.run(y) #执行会话并打印出执行后的结果
可以打印出这样的结果:
Tensor(“matmul:0”, shape(1,1), dtype=float32) 11.
我们可以看到,运行Session()会话前只打印出y是个张量的提示,运行Session()
会话后打印出了 y 的结果 1.03.0 + 2.04.0 = 11.0。
神经网络的参数
神经网络的参数:是指神经元线上的权重 w,用变量表示,一般会先随机生成这些参数。生成参数的方法是让w等于tf.Variable,把生成的方式写在括号里。
神经网络中常用的生成随机数/数组的函数有:
tf.random_normal() 生成正态分布随机数
tf.truncated_normal() 生成去掉过大偏离点的正态分布随机数
tf.random_uniform() 生成均匀分布随机数
tf.zeros 表示生成全 0 数组
tf.ones 表示生成全 1 数组
tf.fill 表示生成全定值数组
tf.constant 表示生成直接给定值的数组
举例
① w=tf.Variable(tf.random_normal([2,3],stddev=2, mean=0, seed=1)),表示生成正态分布随机数,形状两行三列,标准差是 2,均值是 0,随机种子是 1。
② w=tf.Variable(tf.Truncated_normal([2,3],stddev=2, mean=0, seed=1)),表示去掉偏离过大的正态分布,也就是如果随机出来的数据偏离平均值超过两个标准差,这个数据将重新生成。
③ w=random_uniform(shape=7,minval=0,maxval=1,dtype=tf.int32,seed=1),表示从一个均匀分布[minval maxval)中随机采样,注意定义域是左闭右开,即包含 minval,不包含 maxval。
神经网络的搭建
神经网络的实现过程
1、准备数据集,提取特征,作为输入喂给神经网络(Neural Network,NN)
2、搭建 NN 结构,从输入到输出(先搭建计算图,再用会话执行) ( NN 前向传播算法---->计算输出)
3、大量特征数据喂给 NN,迭代优化 NN 参数 ( NN 反向传播算法---->优化参数训练模型)
4、使用训练好的模型预测和分类
由此可见,基于神经网络的机器学习主要分为两个过程,即训练过程和使用过程.训练过程是第一步、第二步、第三步的循环迭代,使用过程是第四步,一旦参数优化完成就可以固定这些参数,实现特定应用了。 很多实际应用中,我们会先使用现有的成熟网络结构,喂入新的数据,训练相应模型,判断是否能对喂入的从未见过的新数据作出正确响应,再适当更改网络结构,反复迭代,让机器自动训练参数找出最优结构和参数,以固定专用模型。
搭建神经网络的八股
神经网络的搭建课分四步完成:准备工作、前向传播、反向传播和循环迭代。
1.导入模块,生成模拟数据集;
-
import
-
常量定义
-
生成数据集
2.前向传播:定义输入、参数和输出
-
x= y_=
-
w1= w2=
-
a= y=
- 反向传播:定义损失函数、反向传播方法
-
loss=
-
train_step=
- 生成会话,训练 STEPS 轮
Reference
https://www.jianshu.com/p/87581c7082ba
https://yq.aliyun.com/articles/178374
北京大学慕课教程-tensorflow笔记