TensorFLow的基本用法

为了使用TensorFlow你需要理解一下几个方面:TensorFlow是如何

  • 把运算表示为图
  • 在 Session 的语境下执行图
  • 把数据用多维向量表示
  • 用 Variable 维护状态
  • 使用feed和fetch把数据放进和取出任意的算子

概述

TensorFlow把运算表示为图。图的节点是ops(operations)。一个op可以对零个或者多个tensor进行运算,产生零个或多个tensor。在TensorFlow的语境下,tensor就是一个多维向量。
一个TensorFlow 图就是一个对运算的描述。运算开始之前你必须把图在一个Session中 启动。Session会把图放在Devices上面,比如CPU、GPU,然后提供方法来进行计算。在Python中这些方法会返回 numpy 的 ndarray,在C/C++中则会返回tensorflow:Tensor类型的实例。

计算流图

TensorFlow程序一般分为构建阶段和执行阶段。在构建阶段,你可以把图组合起来,比如神经网络图模型。在执行阶段则用Session在执行一系列的ops,比如训练神经网络的运算。
TensorFlow的图可以用Python、C或者C++来写,但是Python会简单一点,因为有许多辅助函数可以使用。

  • 构建图
    首先从不需要任何输入的算子开始,比如 Constant 。把输出结果传递给其他需要输入的算子。
    TF的Python提供了默认的图,可以在大多数场景下使用。

    import tensorflow as tf
    
    # Create a Constant op that produces a 1x2 matrix.  The op is
    # added as a node to the default graph.
    #
    # The value returned by the constructor represents the output
    # of the Constant op.
    matrix1 = tf.constant([[3., 3.]])
    
    # Create another Constant that produces a 2x1 matrix.
    matrix2 = tf.constant([[2.],[2.]])
    
    # Create a Matmul op that takes 'matrix1' and 'matrix2' as inputs.
    # The returned value, 'product', represents the result of the matrix
    # multiplication.
    product = tf.matmul(matrix1, matrix2)
    
  • 在Session中启动图

     # Launch the default graph.
     sess = tf.Session()
    
     # To run the matmul op we call the session 'run()' method, passing 'product'
     # which represents the output of the matmul op.  This indicates to the call
     # that we want to get the output of the matmul op back.
     #
     # All inputs needed by the op are run automatically by the session.  They
     # typically are run in parallel.
     #
     # The call 'run(product)' thus causes the execution of three ops in the
     # graph: the two constants and matmul.
     #
     # The output of the matmul is returned in 'result' as a numpy `ndarray` object.
     result = sess.run(product)
     print(result)
     # ==> [[ 12.]]
    
     # Close the Session when we're done.
     sess.close()
    

    你可以使用with语句

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

    通常呢你不需要告诉TF你需要哪个设备进行运算,但是如果你有多个GPU的话你就可以指定TF用哪个设备进行运算了。比如

    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:

with tf.Session("grpc://example.org:2222") as sess:

Calls to sess.run(...) will be executed on the cluster.

...

指定的机器将会成为你的master,并调动集群中的其他机器进行运算。
或者用```tf.device()```语句来指定worker。

with tf.device("/job:ps/task:0"):
weights = tf.Variable(...)
biases = tf.Variable(...)


### 交互使用

在iPython等交互式的Python环境中,你可以用```InteractiveSession```类,用```Tensor.eval()```,```Operation.run()```等方法。

Enter an interactive TensorFlow Session.

import tensorflow as tf
sess = tf.InteractiveSession()

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

Initialize 'x' using the run() method of its initializer op.

x.initializer.run()

Add an op to subtract 'a' from 'x'. Run it and print the result

sub = tf.sub(x, a)
print(sub.eval())

==> [-2. -1.]

Close the Session when we're done.

sess.close()


### Tensor
TensorFlow程序使用Tensor来表示所有的数据。只有Tensor可以在Operation之间传递。你可以把Tensor看作是一个多维数组。Tensor有静态类型、秩以及形状。

### Variable
Variable 维护执行过程中图的状态。

Create a Variable, that will be initialized to the scalar value 0.

state = tf.Variable(0, name="counter")

Create an Op to add one to state.

one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)

Variables must be initialized by running an init Op after having

launched the graph. We first have to add the init Op to the graph.

init_op = tf.global_variables_initializer()

Launch the graph and run the ops.

with tf.Session() as sess:

Run the 'init' op

sess.run(init_op)

Print the initial value of 'state'

print(sess.run(state))

Run the op that updates 'state' and print 'state'.

for _ in range(3):
sess.run(update)
print(sess.run(state))

output:

0

1

2

3

通常你可以把一个统计模型中的参数表达为Variable。比如,把神经网络的权重表达为Variable中的tensor。训练过程中你通过不断地运行图来更新这个tensor。

### Fetches
你可以通过运行Session的```run()```方法来获取tensor的值。比如

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)

output:

[array([ 21.], dtype=float32), array([ 7.], dtype=float32)]

所有需要的op都会被运行一遍。

### Feeds
Feeds用tensor的值暂时取代了一个op的输出。你可以把feed的数据作为参数传进```run()```函数。feed数据仅会应用于当前的 ```run()```。你可以指定```tf.placeholder()```来创建要feed的op。

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.]}))

output:

[array([ 14.], dtype=float32)]







最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容