TensorFlow的Basic Usage

翻译自TensorFlow Basic Usage官方教程

为了使用TensorFlow,我们需要理解以下5点:

  • 用图表示计算
  • 在Session的上下文中执行图运算
  • 用Tensor表示数据
  • 用Variable维护图的状态
  • feed给op输入,fetch到op的输出

Overview

pass

什么是计算图

TF程序可以被结构化为两部分:构造图(construction phase)、执行图(execution phase)。在构造图阶段,组装一个图;执行阶段在Session中执行ops。
例如,我们一般在构造阶段创建一个图来表示和训练神经网络(设定训练的方法),在执行阶段,不断重复地执行图中训练相关的ops。

如何构建图

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)

上面的代码中没有指明图的类型,所以是默认图。对于我们的例子,默认图足够用了。在我们上面创建的默认图中,有三个结点:2个constant op、1个matmul op。为了执行我们定义好的op,需要在session中启动图。

在Session中启动图

构造好一个图之后,我们需要先创建一个Session对象,然后启动图运算。创建Session的时候,如果不设定任何参数,就创建默认图。
完整的Session API见于Session Class.

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

注意执行完毕后要关闭Session,释放资源。当然也可以使用Python的with语句创建一个Session块,执行完毕后,由块负责自动关闭Session。

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

TF自动根据图的定义翻译到可执行op,然后把计算任务分配到不同的计算资源上,例如CPU、GPU。我们不必显式指定CPU或GPU。如果有可利用的GPU,TF会默认使用第一个GPU,并分配尽可能多的计算任务。
如果想使用机器上的其他GPU(非第一个GPU),需要显式地把op分配到指定的GPU上。使用with ... Device可以指定op所需的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)
    ...

Device是通过字符串指定的,现在支持的Device包括:

*"/cpu:0": 机器上的CPU.

*"/gpu:0": 1号GPU,如果你有一个的话。

*"/gpu:1": 2号GPU,以此类推。

更多关于TF和GPU的信息见这里使用GPU

在分布式Session中启动图

pass

Tensors

TF的程序只是用Tensor这种数据结构,ops之间传递的数据也都是Tensor。你可以把TF的tensor想象成多维数组或列表。tensor有静态类型(staic type)、秩(rank)、形状(shape). Rank、Shape和Type有更加详细的介绍。

Variables

图运算过程中的状态需要Variable维护,下面的例子是把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.initialize_all_variables()

# 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

代码中的assign()和add()是图表达式中的一部分,所以只有当真正run()的时候才会执行计算。
通常,我们会把统计模型中的参数看作是多个Variable。例如,把神经网络中的权重看成是Variable tensor。训练过程中通过重复运行训练图更新权重tensor。

Fetches

为了得到op运算的结果,只需要调用Session对象的run()方法,需要获取的结果作为run()的参数。

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

Feeds

上面的例子都是借助constant或者Variable类型,把tensor输入到计算图中。TF提供了更加直接的方式,即feed机制,方便把tensor直接输入到计算图中任何op。

使用feed的方式是,在你需要feed的op处调用run()方法,并提供输入数据,类似于run(op_name, feed_data),其中要用到tf.placeholder()占位符:

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

运行的时候,如果不给占位符提供feed就会报错。较大规模的feed例子见MNIST fully-connected教程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容

  • 基本使用 使用 TensorFlow, 你必须明白 TensorFlow: 使用图 (graph) 来...
    西方失败9527阅读 747评论 0 1
  • 问题导向式学习,以问题为核心,通常一开始就确定了类型、主题和问题,要做的就是去找到对应的信息进行加工,目标非常明确...
    左非阅读 4,186评论 0 5
  • 什么是GTD? GTD 的基本理论是把一个人所要要完成的任务和事件全部从大脑中移出来,记录到纸上。这样,大脑便会不...
    _尔东陈_阅读 235评论 0 0
  • “真的很讨厌你” “但你快生日了” “生日快乐啊”
    月岛雫Eiko阅读 197评论 0 0
  • 暮色霞辉赤胜火,排山倒海映苍穹。 黛青密植散成垛,便撒乡愁万人心。
    微微风吟阅读 139评论 0 0