TensorFlow学习(一)

前言

TensorFlow是Google团队开发的一款开源的用于各种感知和语言理解任务的机器学习框架。它的底层核心引擎由C++实现,但提供了Python、C++、Java、Go等常用计算机语言的接口,可谓是覆盖面很广。开发平台支持Windows、Linux和macOS。

相较于Caffe,TensorFlow上手较难,运行速度慢,且内存耗费高,但是TensorFlow使用了张量(tensor)运算的符号图方法,使得新网络的指定变得相当容易,可支持快速开发,即灵活性很高。加上是Google的亲儿子,很快得到了很多人的认同。

什么是张量运算的符号图方法?符号图也称作数据流图,使用tensorflow时,使用的数据(以张量存在)都得放在数据流图中进行计算。下图为一个数据流图截断:

数据流图

节点在图中表示对数据进行相关操作,线则表示在节点间相互联系的多维数据数组, 即张量(tensor)。训练模型时,tensor会不断的从数据流图中的一个节点流到另一节点, 这也是TensorFlow名字的由来。

最后提下张量,张量是矢量概念的推广,一维的张量称作矢量或向量,如[1, 2, 3];二维的张量称作矩阵,如[[2, 3], [2, 4]];以此类推,后面还有三维,四维等。

数据流图中的基础知识

1.session
session是一个会话控制处理模块,是Tensorflow为了控制和输出对应执行语句。举个栗子,考试的时候,老师在将卷子发完给所有同学之前是不可以动笔答题的(将所有变量进行定义占位),发完卷子后,同学们得到了通知,进行针对不同的题目进行相应的答题步骤(将之前所有定义的变量进行赋值和计算,并针对这些变量进行一系列处理)。

回到Tensorflow上,上面的例子中,后序的答题过程,就是在session完成的,而启动的开关就是session.run()

import tesorflow as tf

#进行定义占位,不作运算和赋值
x1 = tf.constant(3)  #定义一个常量张量
x2 = tf.constant(2)  
res = tf.multiply(x1, x2)  #乘法
#创建一个会话,并把之前所有变量进行赋值和计算
with tf.Session() as sess:
    ans = sess.run(res)
    print(ans)  #6

2.Variable
Variable是tensorflow中变量定义的关键字,即定义变量需要使用tf.Variable()。这里需要注意一点,只要是定义了变量,就需要进行初始化,初始化的过程就是将你定义的变量变为数据流图中使用的张量格式。

import tesorflow as tf

x1 = tf.Variable(3)  #定义一个变量
x2 = tf.Variable(2)
res = tf.multiply(x1, x2)

#将所有定义的变量初始化为张量
init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)  #进行激活,执行
    print(sess.run(res))  #6

3.scope
scope表示域,即变量的作用域。平时在写代码过程中,因为很少会出现很多变量的情况,所以很难体现出scope的作用。而在深度学习网络中,如果不做处理,动则上百个变量是常见的,所以为了便于管理代码,推荐使用scope。下面两张图生动形象的诠释了scope的作用:

使用scope之前

使用scope之后

TensorFlow中有两种scope,一种是name_scope,另一种是variable_scope。name_scope主要用于管理一个数据流图里面的各种layer(也称op),实现一种层次化且有条理的管理,避免各个layer之间命名冲突。而variable_scope一般也可以实现name_scope的作用,但它还有一个更重要的作用,用于管理一个数据流图中变量的名字,避免变量之间的命名冲突。

提到变量命名,先介绍下定义变量的方法也有两种,一种是上面提到的Variable,当在使用Variable定义变量时, 系统会自动检测命名是否冲突并自动处理;还有一种get_variable,使用它定义变量,当遇到要创建重名变量而该变量名没有设置为共享变量时,会报错。

with tf.name_scope("scope1"):
    x1 = tf.Variable(name='var1', initial_value=[1], dtype=tf.float32)
    x2 = tf.Variable(name='var1', initial_value=[2], dtype=tf.float32)
    init = tf.constant_initializer(value=1) #给x3赋值
    #默认为不共享
    x3 = tf.get_variable(name='var2', shape=[1], dtype=tf.float32, initializer = init)
    #x4 = tf.get_variable(name='var2', shape=[1], dtype=tf.float32, initializer = init)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer()) #初始化
    print(x1.name)        # scope1/var1:0
    print(sess.run(x1))   # [1.]
    
    print(x2.name)       # scope1/var1_1:0
    print(sess.run(x2))  # [2.]
    
    print(x3.name)        # var2:0
    print(sess.run(x3))   # [1]
    #print(sess.run(x4))   #error

使用变量共享:

with tf.variable_scope("scope") as scope:
    x1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
    scope.reuse_variables()  # 设置为使用共享变量
    x2 = tf.get_variable(name='var1')

#或者使用 with tf.variable_scope("scope", reuse=reuse):
    
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(x1.name)        #scope/var1:0
    print(sess.run(x1))   #[0.34196675],默认随机初始化值
    
    print(x2.name)       #scope/var1:0
    print(sess.run(x2))  #[0.34196675]

variable_scope的其它常见使用方式:

def fun(x1, x2, scope):
    with tf.variable_scope(scope) :
        return tf.multiply(x1, x2)
    
with tf.variable_scope("fun"):
    x1 = tf.constant(1)  #定义一个常量张量
    x2 = tf.Variable(2)  #定义一个变量,后面需要初始化
    #在fun1域作运算
    res = fun(x1 = x1, x2 = x2, scope = "fun1")
    #在fun2域作运算
    res = fun(x1 = res, x2 = x2, scope = "fun2")
    #在fun3域作运算
    res = fun(x1 = res, x2 = res, scope = "fun3")

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(res))  #16
scope的使用

上图为一个简单的scope运用。值得一提的是,可以把最外层的fun看成一个layer,里面的fun1,fun2,fun3可以替换成相应的卷积,激活操作,最后多个layer进行组合,就是一个深度学习大概的网络模型结构啦。

4.placeholder
在Tensorflow中,每生成一个常量,就需要在数据流图中增加一个节点(如上图),数据量较大时,会导致图特别大。为了解决这个问题,需使用placeholder来输入数据,它相当于定义了一个位置。总结下就是,placeholder是一个占位符,用来暂时储存变量。将上面的代码修改为使用placeholder:

def fun(x1, x2, scope):
    with tf.variable_scope(scope) :
        return tf.multiply(x1, x2)
    
with tf.variable_scope("fun"):
    #placeholder需要定义type,一般为float32
    x1 = tf.placeholder(tf.float32)
    x2 = tf.placeholder(tf.float32)
    #在fun1域作运算
    res = fun(x1 = x1, x2 = x2, scope = "fun1")
    #在fun2域作运算
    res = fun(x1 = res, x2 = x2, scope = "fun2")
    #在fun3域作运算
    res = fun(x1 = res, x2 = res, scope = "fun3")

with tf.Session() as sess:
    #传值
    print(sess.run(res, feed_dict = {x1:2, x2:3})) #324
使用placeholder

【关注公众号DoCode,每日一道LeetCode,还有更多其他博文,将零碎时间利用起来】

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

推荐阅读更多精彩内容

  • 做了几个利用 TensorFlow 来构建 RNN 的练习,发现很多示例代码中的语句的目的和来源不是很清楚,因此特...
    拓季阅读 1,161评论 1 2
  • 简介 TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。Te...
    Mr_差不多阅读 244评论 0 3
  • 简单线性回归 import tensorflow as tf import numpy # 创造数据 x_dat...
    CAICAI0阅读 3,537评论 0 49
  • 我总是喜欢完成需要完成的事情,然后再去做其他的事情。因为我觉得这样子既可以不用去担心那件事情还没有完成,也可以到最...
    屿上屿阅读 156评论 0 3
  • 终于,一切都尘埃落定,虽然早就跟自己说过不要抱希望了,自己也早已经放弃,但是当我看到成绩的时候还是有不甘心,有后悔...
    皎月儿儿阅读 121评论 0 0