lesson2 : Tensorflow 入门

2.1 Tensorflow的计算模型——计算图

  根据lesson1中所讲,Tensorflow实际原理是张量的流动,讲述输入的多维数组(张量)通过不同节点进行不同的运算进行转化的一个过程,Tensorflow的每一个计算都是计算图的一个节点,涉及到一次张量的转化。多个节点构成一个神经元。Tensorflow如果不定义计算图,会自动生成一个默认的计算图,并将定义的计算全部加入默认图。

  如果说类比的话,计算图就像是我们在面向对象编程里的类(看下述代码可以理解),在一个计算图里,每个数据都像是类中的变量,每个计算节点都像是一个成员函数,两个图里的变量名字可以相同但是在指定运行不同的图时,得到结果根据各自图运算过程而定。

  计算图有隔离张量和计算的作用,并对张量和计算进行管理,例如限定计算所使用的GPU等,这个后续学到再说,我现在也不太会😂,而且我前面介绍的安装是CPU版本。自定义图的示例代码如下(python 的缩进很重要,不要漏掉):

import tensorflow as tf

g1 = tf.Graph()
with g1.as_default():
      # 在计算图g1中定义变量“v”,初始化为0
      v = tf.get_variable("v",initializer=tf.zeros_initializer(shape=[1]))

 g2 = tf.Graph()
with g2.as_default():
      # 在计算图g2中定义变量“v”,初始化为1
      v = tf.get_variable("v",initializer=tf.ones_initializer(shape=[1]))

# 在计算图g1中读取变量“v”的值
with tf.Session(graph = g1) as sess:
     tf.initialize_all_variables().run()
     with tf.variable_scope("",reuse=True):
           # 在计算图g1中,“v”为0,所以下述语句应该输出0
           print(sets.run(tf.get_variable("v")))

# 在计算图g2中读取变量“v”的值
with tf.Session(graph = g2) as sess:
     tf.initialize_all_variables().run()
     with tf.variable_scope("",reuse=True):
           # 在计算图g1中,“v”为1,所以下述语句应该输出1
           print(sets.run(tf.get_variable("v")))

  使用图限定计算用的GPU

g = tf.Graph()
# 指定计算运行的设备
with g.device('/gpu:0'):
        result = a + b



2.2 Tensorflow的数据模型——张量

2.2.1 概念

  张量是Tensorflow管理数据的形式,可以简单理解为多维数组,不过Tensor的存储和Numpy的多维数组有所不同,Numpy简介参见这里,观察如下代码:

import tensorflow as tf

#. td.constant 是一个计算,个人感觉和申请const变量差不多,不过结果是一个张量,存储在变量a中
a = tf.constant([1.0,2.0],name="a")
b = tf.constant([2.0,3.0],name="b")
c = tf.constant([2.0,3.0])
d = tf.constant([2.0,3.0])
result = tf.add(a,b,name="add")

print(result) # output : Tensor("add:0",shape=(2,),dtype=float32)
print(a)  # output: Tensor("a:0", shape=(2,), dtype=float32)
print(c) # output: Tensor("Const:0", shape=(2,), dtype=float32)
print(d) # output: Tensor("Const_1:0", shape=(2,), dtype=float32)

sess = tf.Session()
sess.run(result) # output : array([3., 5.], dtype=float32)
less.run(a) # output : array([1., 2.], dtype=float32)

  从上述代码可以发现张量中主要保存了三个属性:名字(name),维度(shape)和类型(type),其中名字遵循“node:src_output”,比如result为add计算节点的第0个输出,所以命名为add:0,因为有的计算节点并不一定输出一个张量,所以src_output为输出序号,node为计算节点名称,tf.constant()和tf.add()均为计算,所以a为a:0,其中节点的名称可以由我们定义,如果我们不自己定义,Tensorflow有自己的默认命名,比如c的"Const:0" 以及d的“Const_1:0”

  所以,我感觉Tensor不能单纯的理解为多维数组,它包含了他是从哪个计算节点计算而来的,以及它的大小,我们可以理解为Tensorflow分为两部分工作,第一部分工作是定义计算图,也就是定义张量是如何流动的,但是每一步运算都并没有实质上的运行,张量就是这样而存在的。第二部分是对计算图进行实质上的通过CPU或者GPU进行计算,这就需要运行Session,Session的使用会在后面小节具体描述,从上述代码可以看到运行sess.run()就会输出运算结果


2.2.2 张量的使用

  观察下列代码的运行

import tensorflow as tf

a = tf.constant([1,2],name="a")
b = tf.constant([2.0,3.0],name="b")
c =  tf.constant([1,2],name="c",dtype=tf.float32)

result = a + b # Get ERROR bellow
# ValueError: Tensor conversion requested dtype int32 for Tensor with dtype float32: 'Tensor("b:0", shape=(2,), dtype=float32)'

result = b+c # no error

  对于Tensorflow,如果不声明类型dtype,那么没有小数点默认类型为int32,有小数点默认为float32,这个和我们编程不一样,不存在强制类型转换,需要注意。Tensorflow所支持的数据类型:

  • 浮点数(tf.float32、tf.float64)
  • 整数(tf.int8、tf.int16、tf.int32、tf.int64、 tf.unit8)
  • 布尔型(tf.bool)
  • 复数(tf.complex64、tf.complex128)
import tensorflow as tf

a = tf.constant([1.0,2.0],name="a")
b = tf.constant([2.0,3.0],name="b")

result = a + b; # 和tf.add()效果相同,根据需要选择,使用tf.add()可以自定义节点的其他属性,比如计算节点的名字

# 和上述代码效果一样,但可读性差
result_1 = tf.constant([1.0,2.0],name="a") + 
           tf.constant([2.0,3.0],name="b")

  从上述代码可以看到,中间变量a和b只是为了存储中间张量,可以不写,但是为了可读性应该使用类似的中间变量增加代码可读性,优点如下:

  • 对于python:由于python的灵活的类型转化无需声明数据类型,设置必要中间变量方便调试
  • 对于Tensorflow: 由于有的网络巨大,在设计计算图时需要考虑张量的大小问题,设置中间变量可以方便的获取中间步骤张量的大小,省去人为计算



2.3 Tensorflow运行模型——会话

  前面两节介绍了Tensorflow如何组织数据和运算,可以认为是计算图的设计部分,而会话(session)是对前面两个部分设计结果的执行。会话可以管理Tensorflow程序运行时的所有资源。计算完成后需要关闭绘画帮助系统回收资源,可以理解为一个指针,这个指针指向计算图的某个节点,该节点就被激活并执行计算,当所有运算执行完,关闭会话,类似于指针的free。

  Tensorflow的会话的使用一般有两种,如下所示,所有计算完成后关闭资源,但是这种方法有一个问题就是当在session.close()执行之前,程序出现异常而退出,那么会造成资源泄漏。不过我喜欢。。😏

# 创建一个会话
sess = tf.Session()
# 使用这个会话得到关心的运算结果,比如上节使用的sess.run(result)
session.run(...)
#关闭会话释放资源
session.close()

  还有一种写法如下,不会泄漏资源,但是我感觉写起来很麻烦

# 创建一个会话,通过Python的上下文管理器来管理这个会话。
with tf.Session() as session:
     # 使用创建的会话计算关心的结果
     session.run(...)
# 不需要调用Session.close()函数
# 当上下文退出后会话关闭并进行资源释放

  以上两种介绍的是Session的简单的也是常用的写法,其实会话的使用很灵活,主要表现在默认会话的设置和使用上。Session和计算图Graph类似存在默认会话,在默认的会话下,无需调用sess.run(),使用方法如下所示

sess = tf.Session()
#设置为默认会话
with sess.as_default():
     print(result.eval())

  同样效果的等价写法还有如下两种:

sess = tf.Session()

# 如下两行等价,均未设置默认会话
print(sess.run(result))
print(result.eval(session=sess))

  如果Session设置为每一步计算节点的默认会话,仅需调用运算节点的eval()成员函数即可得到运算结果,Tensorflow提供一个将自动生成的会话直接注册为默认会话的函数,作用于全局,用法如下:

# 生成一个注册为默认会话的会话sess
sess = tf.InteractiveSession()
print(result.eval())
sess.close()



  至此,Tensorflow的基本思想已经简单介绍完毕,下一部分将根据一些网络的设计和使用展开对Tensorflow展开进阶介绍

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

推荐阅读更多精彩内容

  • TF API数学计算tf...... :math(1)刚开始先给一个运行实例。tf是基于图(Graph)的计算系统...
    MachineLP阅读 3,451评论 0 1
  • 很多时候,急切会让我们忘记忽略许多,就是这样,一念之间的决定现在的结果。
    妖树阅读 208评论 0 0
  • 雨下着下着 停了 再也找不回曾经的那个你
    太平洋深海的鱼阅读 228评论 0 1
  • 从今天起,做自己的英雄。 有些事,一旦养成习惯是很难改变的。就好比你习惯了有人每天跟你说晚安,恍然间他不在问候了,...
    山顶洞人小茶阅读 241评论 0 0
  • 去浙江图书馆了,还不错 吃了好多零食 吃了韩国料理,其实,我有点介意每次都我付钱。。
    英子_b3c9阅读 171评论 0 0