TensorFlow的简单认识

  • Post author:
  • Post category:其他


    在成功安装完成TensorFlow后,对TensorFlow有了个简单的认识,了解和运行了一下TensorFlow的基本流程。

# TensorFlow的几个基本概念
'''
使用TensorFlow, 必须明白:
    TensorFlow使用图(graph)来表示计算任务.
    TensorFlow在被称之为会话(Session)的上下文(context)中执行图.
    TensorFlow使用张量(tensor)表示数据.
    TensorFlow通过变量(Variable)维护状态.
    TensorFlow使用feed和fetch可以为任意的操作(arbitrary operation)赋值或者从其中获取数据.
'''


# TensorFlow的基本流程
'''
TensorFlow是一个编程系统, 使用图来表示计算任务. 图中的节点被称之为op(operation的缩写).
一个op获得0个或多个Tensor, 执行计算, 产生0个或多个Tensor. 每个Tensor是一个类型化的多维数组.
一个TensorFlow图描述了计算的过程. 为了进行计算, 图必须在会话里被启动. 
会话将图的op分发到诸如CPU或GPU之类的设备上, 同时提供执行op的方法. 
这些方法执行后, 将产生的tensor返回. 
'''


# TensorFlow的计算图
'''
TensorFlow程序通常被组织成一个构建阶段和一个执行阶段. 
在构建阶段,op的执行步骤被描述成一个图. 
在执行阶段,使用会话执行执行图中的op.
例如,通常在构建阶段创建一个图来表示和训练神经网络,然后在执行阶段反复执行图中的训练op.
'''


# TensorFlow的构建图
'''
构建图的第一步, 是创建源op(source op).源op不需要任何输入, 例如常量(Constant). 源op的输出被传递给其它op做运算.
Python库中,op构造器的返回值代表被构造出的op的输出,这些返回值可以传递给其它op构造器作为输入.
TensorFlow Python库有一个默认图 (default graph), op构造器可以为其增加节点.这个默认图对许多程序来说已经足够用了.
'''


# TensorFlow的会话启动图
'''
构造阶段完成后, 才能启动图. 
启动图的第一步是创建一个Session对象, 如果无任何创建参数, 会话构造器将启动默认图.
Session对象在使用完后需要关闭以释放资源. 除了显式调用close外, 也可以使用"with"代码块 来自动完成关闭动作.


在实现上,TensorFlow将图形定义转换成分布式执行的操作,以充分利用可用的计算资源(如CPU或GPU). 
一般你不需要显式指定使用CPU还是GPU,TensorFlow能自动检测.如果检测到GPU,TensorFlow会尽可能地利用找到的第一个GPU来执行操作.
如果机器上有超过一个可用的GPU,除第一个外的其它GPU默认是不参与计算的. 
为了让TensorFlow使用这些GPU, 你必须将op明确指派给它们执行. 
with...Device语句用来指派特定的CPU或GPU执行操作:


with tf.Session() as sess:
  with tf.device("/gpu:1"):
    matrix1 = tf.constant([[3., 3.]])
    matrix2 = tf.constant([[2.],[2.]])
    product = tf.matmul(matrix1, matrix2)
    ...
设备用字符串进行标识. 目前支持的设备包括:
"/cpu:0": 机器的CPU.
"/gpu:0": 机器的第一个GPU,如果有的话.
"/gpu:1": 机器的第二个GPU,以此类推.
'''


# TensorFlow的张量Tensor和变量Variables
'''
TensorFlow程序使用tensor数据结构来代表所有的数据,计算图中,操作间传递的数据都是tensor. 
可以把TensorFlow张量tensor看作是一个n维的数组或列表.


变量Variables维护图执行过程中的状态信息. 
'''


# TensorFlow的Fetch和Feed
'''
Fetch是为了取回操作的输出内容,可以在使用Session对象的run()调用执行图时,传入一些tensor,这些tensor会帮助你取回结果.


TensorFlow还提供了feed机制,该机制可以临时替代图中的任意操作中的tensor可以对图中任何操作提交补丁,直接插入一个tensor.
可以提供feed数据作为run()调用的参数.feed只在调用它的方法内有效,方法结束,feed就会消失.
'''


########################################################################################################################
# 对以上介绍的东东下面将以实例进行demo
########################################################################################################################




# 以tf的简称导入tensorflow模块库
import tensorflow as tf



# 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
# TensorFlow程序通常被组织成一个构建阶段和一个执行阶段.
# 首先构建图......


# 创建源 op
# 创建一个常量op1,产生一个 1x2 矩阵. 这个op1被作为一个节点
# 构造器的返回值代表该常量op1的返回值.
matrix1 = tf.constant([[3., 3.]])


# 创建另外一个常量op2,产生一个 2x1 矩阵. 这个op2也被作为一个节点
matrix2 = tf.constant([[2.],[2.]])


# 创建一个矩阵乘法matmul op , 把 'matrix1' 和 'matrix2' 作为输入.
# 返回值 'product' 代表矩阵乘法的结果.
product = tf.matmul(matrix1, matrix2)


# 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
# TensorFlow程序通常被组织成一个构建阶段和一个执行阶段.
# 然后启动图......


# 启动默认图.
sess = tf.Session()


# 调用sess的 'run()' 方法来执行矩阵乘法 op, 传入 'product' 作为该方法的参数.
# 上面提到, 'product' 代表了矩阵乘法 op 的输出, 传入它是向方法表明, 我们希望取回矩阵乘法 op 的输出.
# 整个执行过程是自动化的, 会话负责传递 op 所需的全部输入. op 通常是并发执行的.
# 函数调用 'run(product)' 触发了图中三个 op (两个常量 op 和一个矩阵乘法 op) 的执行.
# 返回值 'result' 是一个 numpy `ndarray` 对象.
result = sess.run(product)
print (result)
# ==> [[ 12.]]
# 任务完成, 关闭会话.Session 对象在使用完后需要关闭以释放资源.
sess.close()


# 除了显式调用 close 外, 也可以使用 "with" 代码块 来自动完成关闭动作.
with tf.Session() as sess:
    result = sess.run(product)
    print (result)




# 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
# TensorFlow将图形定义转换成分布式执行的操作,以充分利用可用的计算资源(如CPU或GPU).
# 启动图......
with tf.Session() as sess:
    with tf.device("/cpu:0"):
        matrix1 = tf.constant([[3., 3.]])
        matrix2 = tf.constant([[2.],[2.]])
        product = tf.matmul(matrix1, matrix2)
    result = sess.run(product)
    print (result) # ==> [[ 12.]]




# 4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
# 为了便于使用Python交互环境,可以使用InteractiveSession代替Session
# 使用Tensor.eval()和Operation.run()方法代替Session.run().这样可以避免使用一个变量来持有会话.


# 进入一个交互式 TensorFlow 会话.
sess = tf.InteractiveSession()


x = tf.Variable([1.0, 2.0])
a = tf.constant([3.0, 3.0])


# 使用初始化器initializer op 的 run() 方法初始化 'x',  变量是需要初始化的,下面会有介绍
x.initializer.run()


# 增加一个加法 add op,  'x' 加 'a'. 运行加法 op, 输出结果
result = tf.add(x, a)


print (result.eval())
# ==> [ 4.  5.]
sess.close()




# 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
# TensorFlow 张量Tensor 变量Variables
# 注意print的结果


# 创建一个变量, 初始化为标量 0.
state = tf.Variable(0)
print(state)


# 创建一个 op,
one = tf.constant(1)
print(one)


# 创建一个 op, 其作用是使 state 增加 1
new_value = tf.add(state, one)
print(new_value)


# 这个节点的op是把state节点和one节点相加赋值给state
update = tf.assign(state, new_value)
print(update)


# 启动图后, 变量必须先经过`初始化` (init) op 初始化,
# 首先必须增加一个`初始化` op 到图中.
init_op = tf.global_variables_initializer()


# 启动图, 运行 op
with tf.Session() as sess:
  # 运行 'init' op
  sess.run(init_op)
  # 打印 'state' 的初始值
  print (sess.run(state))
  # 运行 op, 更新 'state', 并打印 'state'
  for _ in range(3):
    sess.run(update)
    print (sess.run(state))
# 输出:
# 0
# 1
# 2
# 3




# 6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
# TensorFlow的Fetch和Feed


# TensorFlow的Fetch
input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)


intermed = tf.add(input2, input3)


mul = tf.multiply(input1, intermed)


with tf.Session() as sess:
    # result获取的多个tensor值, 在op的一次运行中一起获得(而不是逐个去获取tensor)  这就是Fetch
    result = sess.run([mul, intermed])
    print (result)
# 输出:
# [21.0, 7.0]


# TensorFlow的Feed
# feed使用一个tensor值临时替换一个操作的输出结果. 你可以提供 feed 数据作为 run() 调用的参数.
# feed只在调用它的方法内有效, 方法结束, feed 就会消失.
# 最常见的用例是将某些特殊的操作指定为 "feed" 操作,标记的方法是使用 tf.placeholder()为这些操作创建占位符.
input1 = tf.placeholder("float32")
input2 = tf.placeholder("float32")


output = tf.multiply(input1, input2)


with tf.Session() as sess:
    result = sess.run([output], feed_dict={input1:[7.], input2:[2.]})
    print (result)
# 输出:
# [array([ 14.], dtype=float32)]




# 6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
# TensorFlow的扩展认识
# 再给一些简单的实例进一步的熟识TensorFlow的运行概念
print ('TensorFlow的扩展认识')
#######################
# 定义两个不同的计算图
#######################
print ('定义两个不同的计算图')
g1 = tf.Graph()
with g1.as_default():
    state = tf.Variable(0)
    one = tf.constant(1)
    new_value = tf.add(state, one)
    update = tf.assign(state, new_value)


g2 = tf.Graph()
with g2.as_default():
    matrix1 = tf.constant([[3., 3.]])
    matrix2 = tf.constant([[2.], [2.]])
    product = tf.matmul(matrix1, matrix2)




with tf.Session(graph = g1) as sess:
    tf.global_variables_initializer().run()
    # 打印 'state' 的初始值
    print (sess.run(state))
    # 运行 op, 更新 'state', 并打印 'state'
    for _ in range(3):
        sess.run(update)
        print (sess.run(state))


with tf.Session(graph = g2) as sess:
    tf.global_variables_initializer().run()
    result = sess.run(product)
    print (result)




#######################
# 进一步熟识张量Tensor
#######################
'''
张量结构的三个属性:名字name  维度shape  类型type


name是一个张量的唯一标识符,也给出了这个张量是如何计算出来的.
name冒号后面的数字编号表示这个张量是计算节点上的第几个结果.


shape显示了几个数据就表示是几维的,此数据表示此维度的大小.
shape=(2,)表示是1维数组,此维度的长度为2.


type TensorFlow主要的数据类型有
               np.bool:    (False, True),
               np.bool8:   (False, True),
               np.uint8:   (0, 255),
               np.uint16:  (0, 65535),
               np.int8:    (-128, 127),
               np.int16:   (-32768, 32767),
               np.int64:   (-2**63, 2**63 - 1),
               np.uint64:  (0, 2**64 - 1),
               np.int32:   (-2**31, 2**31 - 1),
               np.uint32:  (0, 2**32 - 1),
               np.float32: (-1, 1),
               np.float64: (-1, 1)}
'''
print ('进一步熟识张量Tensor')
# tf.constant是一个计算op,这个op的结果为一个张量,保存在变量a中.
a = tf.constant([1.0, 2.0], name="a")
print (a)   # Tensor("a:0", shape=(2,), dtype=float32)
b = tf.constant([2.0, 3.0], name="b")
print (b)    # Tensor("b:0", shape=(2,), dtype=float32)


result = a + b
print (result)
'''
输出:
Tensor("add:0", shape=(2,), dtype=float32)
'''


# 通过会话(session)得到张量中的具体数值
sess = tf.InteractiveSession ()
print(result.eval())
sess.close()




#######################
# 进一步熟识会话(session)
#######################
print ('进一步熟识会话(session)')
a = tf.constant([1.0, 2.0], name="a")
b = tf.constant([2.0, 3.0], name="b")
result = a + b


'''
会话(session)拥有并管理tensorflow程序运行时的所有资源。
当所有计算完成之后需要关闭会话来帮助系统回收资源,否则就可能出现资源泄漏的问题。
'''
# 1 通过明确调用会话生成函数和关闭会话函数
sess = tf.Session()      # 创建一个会话。
print(sess.run(result))  # 使用会话得到之前计算的结果。
sess.close()             # 关闭会话使得本次运行中使用到的资源可以被释放。


# 2 使用with statement来创建会话
'''
通过Python的上下文管理器的机制来使用会话。
只要将所有的计算放在"with"的内部就可以,当上下文管理器退出时会话关闭且会自动释放所有资源。
'''
with tf.Session() as sess:
    print(sess.run(result))


# 3 指定默认会话
sess = tf.Session()
with sess.as_default():
     print(result.eval())


sess = tf.Session()
# 下面的两个命令有相同的功能。
print(sess.run(result))
print(result.eval(session=sess))
sess.close()


# 4 使用tf.InteractiveSession直接构建默认会话
sess = tf.InteractiveSession ()
print(result.eval())
sess.close()


# 5 通过ConfigProto配置会话
'''
参数allow_soft_placement
布尔型参数,默认为False。
为了使代码的可移植性更强,在有GPU的环境下常设置为True:
为True时,可以让程序在拥有不同数量的GPU机器上顺利运行。
当某些运算无法被当前GPU支持时(不同的GPU不同的驱动版本等等),可以自动调整到CPU上而不是报错。
以下任意一个条件成立时,GPU上的运算是可以放到CPU上的:
 1.运算无法在GPU上执行
 2.没有GPU资源
 3.运算输入包含对CPU计算结果的引用


参数log_device_placement
布尔型参数,为True时日志中将会记录每个节点被安排在了哪个设备上。
主要是为了调试方便,而在真实的应用环境中常设置为False以减少日志量。
'''
config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=True)
sess1 = tf.InteractiveSession(config=config)
print(result.eval())
sess1.close()


sess2 = tf.Session(config=config)
print(sess2.run(result))
sess2.close()


print ('进一步熟识会话(session) 图')
with tf.Session(config=config) as sess:
#with tf.Session() as sess:
    with tf.device("/gpu:0"):
        matrix1 = tf.constant([[3., 3.]])
        matrix2 = tf.constant([[2.],[2.]])
        product = tf.matmul(matrix1, matrix2)
    result = sess.run(product)
    print (result) # ==> [[ 12.]]


以上的代码有现成的代码文件:http://download.csdn.net/detail/chenleiyfk/9842097



版权声明:本文为chenleiyfk原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。