tensorflow的基本用法

这段很短的Python程序生成了一些三维数据,然后用一个平面拟合它。

#!/usr/bin/env python
# coding=utf-8
import numpy as np
import tensorflow as tf

x_data=np.float32(np.random.rand(2, 100) )
y_data=np.dot([0.100, 0.200], x_data)+0.300

b=tf.Variable(tf.zeros([1]) )
W=tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0)  )
y=tf.matmul(W, x_data)+b

loss=tf.reduce_mean(tf.square(y-y_data))
optimizer=tf.train.GradientDescentOptimizer(0.5)
train=optimizer.minimize(loss)

init=tf.initialize_all_variables()

sess=tf.Session()
sess.run(init)

for step in xrange(0, 201):
    sess.run(train)
    if step%20==0:
        print step, sess.run(W), sess.run(b)

sess.close()



使用tensorflow,必须明白

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

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

l  使用tensor表示数据

l  通过变量(Variable)维护状态

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

综述

Tensorflow是一个编程系统,使用图来表示计算任务。图中的节点被称之为op(operation的缩写)。一个op获得0个或多个Tensor,执行计算,产生0个或多个Tensor。每个Tensor是一个类型化的多维数组。

一个TensorFlow图描述了计算的过程。为了进行计算,图必须在会话里被启动。会话将图的op分发到诸如CPU或者GPU之类的设备上,同时提供执行op的方法。这些方法执行后,将产生的tensor返回。在python语言中,返回的tensor是numpy ndarray对象;在C和C++语言中,返回的tensor是tensorflow::Tensor实例。

计算图

Tensorflow程序通常被组织成一个构建阶段和一个执行阶段。在构建阶段,op的执行步骤被描述成一个图。在执行阶段,使用会话执行执行图中的op。

例如,通常在构建阶段创建一个图来表示和训练神经网络,然后在执行阶段反复执行途中的训练op

构建图

构建图的第一步,是创建源op(source op),源op不需要任何操作,例如常量(Constant),源op的输出被传递给其它op做运算。

Python库中,op构造器的返回值代表被构造出的op的输出,这些返回值可以传递给其它op构造器作为输入。

Tensorflow Python库有一个默认图(defaultgraph),op构造器可以为其增加节点。这个默认图对许多程序来说已经足够用了。

启动图

构造阶段完成后,才能启动图。启动图的第一步是创建一个Session对象,如果无任何创建参数,会话构造器将启动默认图。

Session对象在使用完后需要关闭以释放资源。除了显示调用close外,也可以使用”with”代码块来自动完成关闭操作。


# -*-coding:utf-8-*-

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)

#启动默认图
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

#任务完成,关闭会话
sess.close()



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

交互式使用

文档中的Python示例使用一个会话Session来启动图,并调用Session.run()方法执行操作。

为了便于使用诸如IPython之类的Python交互环境,可以使用InteractiveSession代替Session类,使用Tensor.eval()和Operation.run()方法代替Session.run()。这样可以避免使用一个变量来持有对话。

# -*-coding:utf-8-*-

#进入一个交互式Tensorflow会话
import tensorflow as tf
sess=tf.InteractiveSession()

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

#使用初始化器initializer op的run()方法初始化'x'
x.initializer.run()
#增加一个减法操作 sub op,从'x'减去'a',运行减法op,输出结果
sub=tf.sub(x, a)
print sub.eval()


Tensor

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

# -*-coding:utf-8-*-

import tensorflow as tf
#创建一个变量,初始化为标量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)
    #运行op, 更新'state',并打印'state'
    for _ in range(3):
        sess.run(update)
        print sess.run(state)



Fetch

为了取回操作的输出内容,可以在使用Session 对象的run() 调用执行图时,传入一些tensor ,这些 tensor 会帮助你取回结果。 在之前的例子里, 我们只取回了单个节点state ,但是你可以取回多个 tensor

#!/usr/bin/env python
# coding=utf-8
import numpy as np
import tensorflow as tf

input1=tf.constant(3.0)
input2=tf.constant(2.0)
input3=tf.constant(5.0)
intermed=tf.add(input2, input3)
mul=tf.mul(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() 为这些操作创建占位符。

#!/usr/bin/env python
# coding=utf-8
import numpy as np
import tensorflow as tf

input1=tf.placeholder(tf.float32)
input2=tf.placeholder(tf.float32)
output=tf.mul(input1, input2)

with tf.Session() as sess:
    print sess.run([output], feed_dict={input1:[7.], input2:[2.]})















  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值