《TensorFlow-实战Google深度学习框架》学习笔记 计算图、张量、会话

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()
                

             

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值