3.1 TensorFlow计算模型——计算图
Tensor:是张量,可以简单理解为多维数组,相当于表明了数据结构
Flow:是流,表达张量之间通过计算相互转化的过程,相当于计算模型
TensorFlow中每个计算都是计算图上的一个节点,节点之间的边描述的计算之间的依赖关系
TensorFLow程序一般可以分为两个阶段,第一阶段需要定义计算图中的所有计算,第二阶段为执行计算(会话)。
import tensorflow as tf
a = tf.constant( [1.0,2.0], name='a' )
b = tf.constant( [2.0,3.0], name='b' )
result = a+b
这里将a和b定义为两个常量,一个是[1.0,2.0],另一个是[2.0,3.0]
tensorflow会自动维护一个默认的计算图,可以通过tf.get_default_graph获取当前默认的计算图,如接上段代码:
print a.graph is tf.get_default_graph() //结果应该是True
TensorFlow支持用tf.Graph生成新图,不同计算图上的张量和运算不会共享(有点像类),以下代码之一不同计算图上定义和使用变量
#encoding:utf-8
import tensorflow as tf
#定义了g1和g2两个图,并定义两个变量v,分别初始化为全0和全1的
g1 = tf.Graph()
with g1.as_default():
v = tf.get_variable( 'v', initializer=tf.zeros_initializer( shape=[1]))
g2 = tf.Graph()
with g2.as_default():
v = tf.get_varialbe( 'v', initializer=tf.ones_initializer(shape=[1]) )
#分别在图g1和g2中读取了变量v的取值
with tf.Session( graph=g1 ) as sess:
tf.initizlize_all_varialbes().run()
with tf.varialbe_scope( '', reuse=True ):
print( sess.run( tf.get_variable('v') ) )
with tf.Session( graph=g2 ) as sess:
tf.initizlize_all_varialbes().run()
with tf.varialbe_scope( '', reuse=True ):
print( sess.run( tf.get_variable('v') ) )
3.2 TensorFlow数据模型——张量
tensor:张量,可以简单理解为多维数组,但在tensorFlow中并不是直接采用形式
它只是对TensorFlow中的运算结果的引用
保存如何得到结果的过程
#encoding:utf-8
import tensorflow as tf
# tf.constant是一个计算,这个计算的结果为一个张量,保存在变量a中
a = tf.constant( [1.0,2.0], name='a' )
b = tf.constant( [2.0,3.0], name='b' )
result = (a + b)*3
print result #Tensor("mul:0", shape=(2,), dtype=float32)
#执行方法1
sess = tf.Session()
print sess #<tensorflow.python.client.session.Session object at 0x7f5bc54a4610>
print sess.run(result) #[ 9. 15.]
sess.close()
# #执行方法2
# with tf.Session() as sess:
# print sess.run(result) #[ 9. 15.]
tensorflow要输出相加得到的结果不能简单地直接输出result,要先生成一个会话(session),通过会话来计算结果,关于会话会在后续提及。
一个张量含有三个属性:
1、名字(name):不仅是一个张量的唯一标识符,同样给出这个张量是如何计算出来的
2、维度(shape):描述一个张量的维度信息
3、类型(type):每个张量会有一个唯一的类型
张量的使用主要可以总结为两大类:
1、对中间计算结果的引用
2、当计算图构造完成之后,张量可以用来获得计算结果,得到真实数字(需要通过会话session得到)。
3.3 TensorFlow运行模型——会话
Session:会话
TensorFlow通过会话执行定义好的运算
拥有并管理TensorFlow运行时所有的资源
当计算完成后需要关闭会话来帮助系统回收资源,否则会出现资源泄露的问题
# 创建一个会话
sess = tf.Session()
# 使用这个会话来得到运算的结果,如上面中的result运算的结果
sess.run( result )
# 关闭会话
sess.close()
# 用with创建会话可以不用调用session.close()
with tf.Session as sess:
sess.run( result )
TensorFlow会自动生产一个默认图,如果没有特殊指定,运算会自动加入这图中。会话也有相似机制,但不会自动生成一个默认会话,而需要手动指定。当默认会话被指定后可以通过tf.Tensor.eval函数来计算一个张量的取值
sess = tf.Session()
with sess.as_default():
print result.eval()
以下代码具有相同功能sess = tf.Session()
print sess.run( result )
print result.eval( session=sess )
3.4 TensorFLow实现神经网络
用TensorFLow实现神经网络,我们可以分为4步:
1、了解神经网络的前向传播算法
2、通过TensorFLow中的变量来表达神经网络的参数
3、学习神经网络的反向传播算法的原来以及TensorFLow对反向传播算法的支持
4、实现一个完整的简单的神经网络
3.4.1 神经网络的前向传播算法
本次以一个三层全连接神经网络为例子
前向传播结果需要3部分信息:
输入:就是从实体中提取的特征向量
连接结构:神经网络的结构给出不同神经元(节点)之间输入输出的连接关系
参数:在下图中用W来表示神经元中的参数
我们暂时假设神经网络中的各边的权重是已知的,就可以通过前向传播算法计算出神经网络的输出。
其中a11的详细计算过程:
如此类推得到各节点的计算结果。
仔细观察可以发现,整个前向传播算法可以表示为一个矩阵乘法。
输入层x1和x2组织成一个1*2的矩阵:
W(1)组织成一个2*3的矩阵:
通过矩阵乘法可以得到3个节点的输出矩阵:
同理W(2)组织成3*1的矩阵,并通过矩阵乘法得到输出层。
这用就可以将前向传播算法通过矩阵乘法表达出来,在TensorFLow中可以通过tf.matmul实现矩阵的乘法运算。
以下代码实现的前向传播过程:
a = tf.matmul( x, w1 )
y = tf.matmul( a, w2 )
在后续中将加入偏置(bias)、激活函数等更加复杂的神经元结构,和卷积神经网络、LSTM等更加复杂的神经网络结构。
3.4.2 通过TensorFLow中的变量来表达神经网络的参数
TensorFlow中变量(tf.Varialbe)的作用就是用来保存和更新神经网络中的参数
如上面的w1和w2可以用一下代码定义
w1 = tf.Variable( tf.random_normal( [2,3], stddev=2, seed=1 ))
w2 = tf.Variable( tf.random_normal( [3,1], stddev=2, seed=1 ))
tf.random_normal( [2,3], stddev=2 )会产生一个2*3的矩阵,其中元素均是随机数,均值(mean)默认为0,标准差(stddev)为2,通过seed参数设定种子,保证每次运行得到的结果一样。
虽然变量定义时给出了变量初始化的方法,但这个方法并没有真正运行,需要通过w1.initializer和w2.initializer来给变量赋值。当变量太多时,一个一个初始化就显得比较麻烦,因此可以通过tf.initializer_all_variable函数来实现所有变量的初始化。
以下代码实现了神经网络的前向传播过程
import tensorflow as tf
# 声明两个变量
w1 = tf.Variable( tf.random_normal( [2,3], stddev=2, seed=1 ))
w2 = tf.Variable( tf.random_normal( [3,1], stddev=2, seed=1 ))
# 暂时将输入特征定义为一个常量,这里x是一个1*2的矩阵
x = tf.constant( [[0.7,0.9]])
# 前向传播算法
a = tf.matmul( x, w1 )
y = tf.matmul( a, w2 )
sess = tf.Session()
# 在执行运算前要先初始化w1和w2两个变量
sess.run( w1.initializer )
sess.run( w2.initializer )
# # 也可以用一下的代码代替上两行,实现相同结果
# init_op = tf.initializer_all_variables()
# sess.run( init_op )
# 运行输出[[ 15.83031178]]
print sess.run(y)
sess.close()