Tensorflow入门(1)

Hello, Tensor World!

让我们来分析一下你刚才运行的 Hello World 的代码。代码如下:

import tensorflow as tf

# Create TensorFlow object called hello_constant
hello_constant = tf.constant('Hello World!')

with tf.Session() as sess:
    # Run the tf.constant operation in the session
    output = sess.run(hello_constant)
    print(output)

Tensor

在 TensorFlow 中,数据不是以整数、浮点数或者字符串形式存储的。这些值被封装在一个叫做 tensor 的对象中。在 hello_constant = tf.constant('Hello World!') 代码中,hello_constant 是一个 0 维度的字符串 tensor,tensor 还有很多不同大小:

# A is a 0-dimensional int32 tensor
A = tf.constant(1234) 
# B is a 1-dimensional int32 tensor
B = tf.constant([123,456,789]) 
 # C is a 2-dimensional int32 tensor
C = tf.constant([ [123,456,789], [222,333,444] ])

tf.constant() 是你在本课中即将使用的多个 TensorFlow 运算之一。tf.constant() 返回的 tensor 是一个常量 tensor,因为这个 tensor 的值不会变。

Session

TensorFlow 的 api 构建在 computational graph 的概念上,它是一种对数学运算过程进行可视化的方法(在 MiniFlow 这节课中学过)。让我们把你刚才运行的 TensorFlow 代码变成一个图:

[图片上传失败...(image-7a7e3b-1519310006634)]
如上图所示,一个 "TensorFlow Session" 是用来运行图的环境。这个 session 负责分配 GPU(s) 和/或 CPU(s),包括远程计算机的运算。让我们看看如何使用它:

with tf.Session() as sess:
    output = sess.run(hello_constant)

代码已经从之前的一行中创建了 tensor hello_constant。接下来是在 session 里对 tensor 求值。

这段代码用 tf.Session 创建了一个 sess 的 session 实例。然后 sess.run() 函数对 tensor 求值,并返回结果。
下一项

输入

向 session 传入一个 tensor 并返回结果。如果想使用一个非常量 ==(non-constant)== 该怎么办?这就是 ==tf.placeholder()== 和 ==feed_dict== 派上用场的时候了。这一节将向你讲解向 TensorFlow 传输数据的基础知识。

tf.placeholder()

很遗憾,你不能把数据集赋值给 x 再将它传给 TensorFlow。因为之后你会想要你的 TensorFlow 模型对不同的数据集采用不同的参数。你需要的是 tf.placeholder()

数据经过 tf.session.run() 函数得到的值,由 tf.placeholder() 返回成一个 tensor,这样你可以在 session 运行之前,设置输入。

Session 的 feed_dict

x = tf.placeholder(tf.string)

with tf.Session() as sess:
    output = sess.run(x, feed_dict={x: 'Hello World'})

==用 tf.session.run() 里的 feed_dict 参数设置占位 tensor==。上面的例子显示 tensor x 被设置成字符串 "Hello, world"。如下所示,也可以用 feed_dict 设置多个 tensor。

x = tf.placeholder(tf.string)
y = tf.placeholder(tf.int32)
z = tf.placeholder(tf.float32)

with tf.Session() as sess:
    output = sess.run(x, feed_dict={x: 'Test String', y: 123, z: 45.67})
    print(output)

Out []:
Test string

x = tf.placeholder(tf.string)
y = tf.placeholder(tf.int32)
z = tf.placeholder(tf.float32)
input_=[x,y,z]
with tf.Session() as sess:
    output = sess.run(input_, feed_dict={x: 'Test String', y: 123, z: 45.67})
    print(output)

Out []:
[array('Test String', dtype=object), array(123), array(45.66999816894531, dtype=float32)]

注意:

如果传入 feed_dict 的数据与 tensor 类型不符,就无法被正确处理,你会得到 “ValueError: invalid literal for...”。

练习
让我们看看你对 tf.placeholder() 和 feed_dict 的理解如何。下面的代码有一个报错,但是我想让你修复代码并使其返回数字 123。修改第 11 行,使代码返回数字 123。

import tensorflow as tf
#run函数
def run():
    output = None
    x = tf.placeholder(tf.int32)

    with tf.Session() as sess:
        # TODO: Feed the x tensor 123
        output = sess.run(x, feed_dict={x: 123})

    return output

TensorFlow 数学

获取输入很棒,但是现在你需要使用它。你将使用每个人都懂的基础数学运算,加、减、乘、除,来处理 tensor。(更多数学函数请查看文档)。

  • 加法

x = tf.add(5, 2) # 7
从加法开始,tf.add() 函数如你所想,它传入两个数字、两个 tensor、或数字和 tensor 各一个,以 tensor 的形式返回它们的和。

  • 减法和乘法

这是减法和乘法的例子:

x = tf.subtract(10, 4) # 6
y = tf.multiply(2, 5)  # 10

x tensor 求值结果是 6,因为 10 - 4 = 6。y tensor 求值结果是 10,因为 2 * 5 = 10。是不是很简单!

  • 类型转换

为了让特定运算能运行,有时会对类型进行转换。例如,你尝试下列代码,会报错:

tf.subtract(tf.constant(2.0),tf.constant(1))  # Fails with ValueError: Tensor conversion requested dtype float32 for Tensor with dtype int32:

这是因为常量 1 是整数,但是常量 2.0 是浮点数,subtract 需要它们的类型匹配。

在这种情况下,你可以确保数据都是同一类型,或者强制转换一个值为另一个类型。这里,我们可以把 2.0 转换成整数再相减,这样就能得出正确的结果:

tf.subtract(tf.cast(tf.constant(2.0), tf.int32), tf.constant(1))   # 1

练习
让我们应用所学到的内容,转换一个算法到 TensorFlow。下面是一段简单的用除和减的算法。把这个算法从 Python 转换到 TensorFlow 并把结果打印出来。你可以用 tf.constant() 来对 10、2 和 1 赋值。

import tensorflow as tf

#定义constant
x = tf.constant(10)
y = tf.constant(2)
z = tf.subtract(tf.divide(x,y),tf.constant(1,tf.float64))
#注意tf.divide()函数返回的是一个float64
#类型转换可以用tf.cast()
#z = tf.subtract(tf.divide(x, y),tf.cast(tf.constant(1), tf.float64))

#print z with sess
with tf.Session() as sess:
    output=sess.run(z)
    print(output)

本章总结

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

推荐阅读更多精彩内容