tensorflow学习二

来源:互联网 发布:移动数据被禁用怎么开 编辑:程序博客网 时间:2024/06/15 07:46

Tensorflow的基本使用

使用图(graph)来表示计算任务;

在被称之为会话(Session)的上下文(context)中执行图;

使用tensor表示数据;

通过t变量(Variable)维护状态;

使用feed和fetch可以为任意的操作(arbitrary operation)赋值或者从其中获取数据。

综述:

TensorFlow是一个编程系统,使用图来表示计算任务。图中的节点被称之为op(operation的缩写)。一个op获取0个或多个Tensor,执行计算,产生0个或多个Tensor。每个Tensor是一个类型的多维数组。例如,可以将一个小组图像集表示为一个四维浮点数数组,这四个维度分别是[batch,height,width,channels]。

一个TensorFlow图描述了计算的过程。为了进行计算,图必须在会话里被启动。会话将图的op分发到CPU或GPU之类的设备上,同时提供执行op的方法。这些方法执行后,将产生的tensor返回。

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

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

import tensorflow as tf


#创建一个常量op,产生一个1*2矩阵,这个op被作为一个节点
#加载默认图中
#构造器的返回值代表该常量op的返回值
matrix1=tf.constant([[3,3]])
#创建另外一个常量op,产生一2*1矩阵
matrix2=tf.constant([[2],[2]])
#创建一个矩阵乘法matmul op,把matrix1和matrix2作为输入
#返回值product代表矩阵乘法的结果
product=tf.matmul(matrix1,matrix2)
默认图现在有三个节点,两个constant() op,和matmul() op。为了真正进行矩阵相乘运算,并得到矩阵乘法的结果,必须在会话里启动这个图。

在一个会话中启动图:构造阶段完成后,才能启动图。启动图的第一步是创建一个Session对象,如果无任何创建参数,会话构造器将启动默认图。传入product作为该方法的参数

#启动默认图
sess=tf.Session()
#调用sess的run()方法来执行矩阵乘法op,传入product作为该方法的参数
result=sess.run(product)
print(result)
sess.close()

# with tf.Session() as sess:
#     result=sess.run(product)
#     print(result)

在实现上,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'):

...

Tensor:TensorFlow程序使用tensor数据结构来代表所有的数据,计算图中,操作间传递的数据都是tensor。可以把TensorFlow tensor看作一个n维的数组或列表。一个tensor包含一个静态rank,和一个shape。

变量:变量维护图执行过程中的状态信息

#创建一个变量,初始化为标量0
state=tf.Variable(0,name='counter')
#创建一个op,其作用是使state增加1
one=tf.constant(1)
new_value=tf.add(state,one)
update=tf.assign(state,new_value)

#启动图后,变量必须先经过初始化(init)op初始化
#首先必须增加一个初始化op到图中
init_op=tf.initialize_all_variables()
#启动图,运行op
with tf.Session() as sess:
    #运行init op
    sess.run(init_op)
    #打印state的初始值
    print(sess.run(state))
    for _ in range(3):
        sess.run(update)
        print(sess.run(state))
assign()操作使图所描绘的表达式的一部分,正如add()操作一样。所以在调用run()执行表达式之前,它并不会真正执行赋值操作。

通常会将一个统计模型中的参数表示为一组变量。例如,可以将一个神经网络的权重作为某个变量存储在一个tensor中,在训练过程中,通过重复运行训练图,更新这个tensor。

Fetch:为了取回操作的输出内容,可以在使用Session对象的run()调用执行图时,传入一些tensor,这些tensor会会帮助你取回结果。
input1=tf.constant(3)
input2=tf.constant(2)
input3=tf.constant(5)
intermed=tf.add(input2,input3)
mul=tf.multiply(input1,intermed)
with tf.Session() as sess:
    result=sess.run([mul,intermed])
    print(result)

需要获取的多个tensor值,在op的一次运行中一起获得(而不是逐个获取tensor)

Feed:上述示例在计算图中引入了tensor,以常量或变量的形式存储。TensorFlow还提供了feed机制,该机制可以临时替代图中的任意操作中的tensor可以对图中任何操作提交补丁,直接插入一个tensor。feed使用以tensor值临时替换一个操作的输出结果。可以提供feed数据作为run()调用的参数。feed只在调用它的方法内有效,方法结束,feed就会消失。最常见的用例是将某些特殊的操作指定为feed操作,标记的方法是使用tf.placeholder()为这些操作创建占位符。

input4=tf.placeholder(tf.float32)
input5=tf.placeholder(tf.float32)
output=tf.multiply(input4, input5)
with tf.Session() as sess:
    print(sess.run([output],feed_dict={input4:[7],input5:[2]}))

原创粉丝点击