tf一些函数

对于 tf.get_variable() vs tf.Variable(),tf.name_scope() vs tf.variable_scope()

最近刚接手tf,有些函数,理解不清楚,做一下笔记。
对于函数,知道平时的用法就行了,不用纠结里面的每一个参数的意思,基本用不到,还浪费时间

一、name-scope 和 variable-scope

name-scope 和 variable-scope 都是命名空间,意思就是,定义一个空间,在这个空间里面的,定义的变量,基本都会以这个命名空间作为其变量名的前缀。(但是也有例外)

比如下图中,尽管是两段代码,但都是在variable-scope定义的名称为“V1”的空间中。而reuse命令,允许共享当前scope(同一个命名空间)下的所有变量,所以a1和a3的变量名都是 V1/a1:0

import tensorflow as tf    
import numpy as np    

with tf.variable_scope('V1'):  
    a1 = tf.get_variable(name='a1', shape=[1], initializer=tf.constant_initializer(1))  
  
with tf.variable_scope('V1', reuse=True):  
    a3 = tf.get_variable('a1')  
  • name_scope对 get_variable()创建的变量 的名字不会有任何影响,而创建的op会被加上前缀.
  • tf.get_variable_scope() 返回的只是 variable_scope,不管 name_scope.所以以后我们在使用tf.get_variable_scope().reuse_variables() 时可以无视name_scope
  • name_scope 是给op_name加前缀, variable_scope是给get_variable()创建的变量的名字加前缀。

二 、tf 的 reduce(降维)操作

1. 基础理解

1.1 向量的“维”

这里加入基础理解的意思,是为了防止概念不清晰。
比如若说X是一个n维向量,表示X中,含有n个元素,可以在n维坐标系中表示出来(原点到X坐标的向量)。另外,在机器学习的降维中,是把X从n维降到k维。 ---但这不是tf中的‘‘降维”

n维向量!= n维数组!!!

1.2 tf中的“维”

在tf中,用constant定义的tensor

  • 0维数组,表示一个数,如:6。(可以理解为“点”)
  • 1维数组,表示一个a = [1,2,3]。(可以理解为“线”,这也和上面的向量联系起来了。一方面,这是一个三维向量,另一方面,在n维坐标系中,向量是一条直线,是“线”)
  • 2维数组,表示一个
    b = [[1,2,3],
    [4,5,6]]。(可以理解为“面”,或者矩阵)
  • 3维数组,表示一个
    c = [[[1,2,3],[4,5,6]],
    [[7,8,9],[1,1,1]],
    [[2,2,2],[3,3,3]]]
    可以理解为“体”。
1.3 对数组进行索引

索引,类似于Python中的列表索引,0表示第一个元素,但又不一样。
比如,对上面的2维数组b进行索引 ,得到
b[0] = [1,2,3],
c[0] = [[1.2.3].[4.5.6]] (都是数组里的第一个元素)

1.4 tf.reduce_xxx操作中的axis

因为版本的不同,有时参数axis(轴)等同于参数reduction_indices(减去索引)
这里所说的,应该是侧重于axis轴的意思

这里作者就按照坐标轴来理解。比如,上面的三维数组c,我把它理解为由x,y,z轴组成的坐标系中的三个自变量组成的“体”,c的0维就相当于x变量,剩下的由y和z两个组成的几个平面,也就是剩下的3个二维数组。这里的“c的0维”不等于“c[0]”。

那么。去掉c的0维,就相当于只剩下y,z两个变量组成的三个平面。

reduc_sum(c,0)那就理解为,先把三个平面相加,再去掉x自变量。
所以,就相当于,先把每个第0维里面的元素(即三个二维数组)按照规则相加,再去掉最外面的“0维”。于是,最后剩一个二维数组。

最外面的中括号代表了第0维,再往里代表了第1维(比如[[1,2,3],[4,5,6]],第一维里面的元素相加,就是[1,2,3]+[4,5,6]),再往里代表了第2维(比如[1,2,3].)

1.5 代码

具体别的情况,就看下面代码。其中,keep_dims表示的意思就是,照常计算,但不消除该维。

import tensorflow as tf
import numpy as np    

x = [[[1,2,3],[4,5,6]],
[[7,8,9],[1,1,1]],
[[2,2,2],[3,3,3]]]

x = tf.constant(x)

# x 后面没有参数,就默认为把所有的元素相加
a = tf.reduce_sum(x)

#把所有0维里的元素都按照规则相加,再消去0维度(即消去代表0维度的中括号)
b = tf.reduce_sum(x,0)

#以下没有消去的维度都是保留的
#只举一个例子,把目前所有1维里的元素都相加如 ==>得到相加的结果 ==>再消去1维度
# [1,2,3]+[4,5,6] ==> [5,7,9] ==>5,7,9
c = tf.reduce_sum(x,1)

#只举一个例子, 把所有第2维的元素都相加 ==> 得到结果 ==> 消去2维度
# [1+2+3],[4+5+6] ==> [6],[15] ==> 6,15
d = tf.reduce_sum(x,2)

# 把第1维所有元素相加,得到结果 ==> 再把第2维所有元素相加,得到结果 ==>消去1,2维度
# [[[5,7,9]],[[8,9,10]],[[5,5,5]]]==>[[[21]],[[27]],[[15]]]==>[21,27,15]
f = tf.reduce_sum(x,[1,2])

#把0维所有元素相加以后,1维所有元素相加以后,2维所有元素相加以后消去012维
g = tf.reduce_sum(x,[0,1,2])

#把目前所有1维里的元素都相加如 ==>得到相加的结果 ==>但不消去1维度(即括号不去掉)== 保留该维度
# [1,2,3]+[4,5,6] ==> [5,7,9] ==>[5,7,9]
h = tf.reduce_sum(x,1,keep_dims=True)

#只举一个例子, 把所有第2维的元素都相加 ==> 得到结果 ==> 但不消去2维度 == 保留该维度
# [1+2+3],[4+5+6] ==> [6],[15] ==> [6],[15]
i = tf.reduce_sum(x,2,keep_dims=True)

with tf.Session() as sess:
   print('a',sess.run(a))
   print('b',sess.run(b))
   print('c',sess.run(c))
   print('d',sess.run(d))
   print('f',sess.run(f))
   print('g',sess.run(g))
   print('h',sess.run(h))
   print('i',sess.run(i))

三、tf.nn.embedding_lookup()函数

基础知识

shape,列表和数组,

  • 1 shape方法
    shape方法得到的结果的是一个tuple,从第一个元素到最后一个元素,依次表示的是从数组第0维里含有元素的个数,第1维含有元素的个数,第2维。。。如上面的x数组,x.shape ==>(3,2,3);再如a=[1,2,3]是一个列表,那么a.shape ==>(3,)一定有一个逗号,表示这是一个元组的数据结构

  • 2 列表和数组
    在运用一个函数或者方法之前,一定要弄明白,需要传入的参数是什么数据结构的!!!就比如这个方法,作者一开始定义好x之后,没有用np.array设置成数组,或者用constant设置成一个整体的tensor,结果x一直是列表形式,最终出现毛病。

def embedding_lookup(params, ids, partition_strategy="mod"),主要讲这三个参数。

params可以是一个tensor,也可以是多个tensor,不过输入多个tensor的时候,需要用作为params=[a,b,c]的形式进行输入。

当系统认为,params的长度等于1时候,就和平时的索引一样,按照ids中的id索引就行。

但是当系统认为params的长度大于1的时候,就会用第三个参数(默认是“mod”)的模式,将params去掉里面每个tensor的中括号以后所有的元素个数,按照求余数相同的方式分成len(params)个切片,每个切片里的第i个id对应该切片里的第i个元素。
举个栗子:
a = [[1,2,3],[4,5,6]]
b = [[7,8,9],[1,1,1]]
c = [[2,2,2],[3,3,3]]
a = tf.constant(a)
b = tf.constant(b)
c = tf.constant(c)

那么传入params=[a,b,c],此时,系统认为params里是多个量了(3个tensor),那么去掉每个tensor的最外面中括号共有3*2=6个元素,所以一共可以有6个id,分别是012345,有3个tensor,就有3个切片。按照余数相同分组,不均匀就前面的分的多。分为[0,3],[1,4],[2,5],对应的分别是 a,b,c。索引id时,id等于3,就相当于索引的是a中第二个元素,所以索引的是[4,5,6].

另外,返回的tensor的shape应该是shape(ids) + shape.params[1:]
这里的params指的是被索引的那个param
比如ids = [3],那么返回的结果的shape应该是shape.[3] + shape.a[1:]=(1,)+(2,3)[1:] = (1,)+(3,) = (1,3),所以结果应该是[[4,5,6]],二维数组
但这里,这个函数是把a作为一个params了,作为一个tensor了。

另外需要注意的是,tf中传入多个参数,就是用中括号把参数作为一个整体,以列表的方式传给函数。所以,有的函数一旦遇到[a,b,c]这种形式的,就会认为a,b,c是参数。
所以,若是x一开始定义为列表格式的话,那么这个函数就会把这个‘表示为列表的中括号’认为是类似于上面的[a,b,c]这个传参的中括号,从而把x认为是由三个tensor组成的。然后就会启动上面所说的切片模式。比如用上面说的x,那么就会认为x是三个[2,3]的数组。

但是如果用np.array(x)或者用x=tf.constant(x)以后,x就被认为是一个整个的tensor了,那么这时候就认为x是1个,就不会启动上面的切片模式,就是正常的索引现象。

以后在遇到的时候,需要先明确x是列表,还是由constant定义好了的一个tensor(或者nparray定义的数组)。自己用的时候,最好用后者,把x当成是一个整体,若是需要输入多个,那么就用[a,b,c]的方式输入。

四、 tf.gather(params,indices,..)

合并 - 索引indices所指示的params中的切片
比如a = tf.gather(x,[0,2]),就是索引x这个tensor的0维下的元素的位置索引为0,2的两个元素 并合并起来,即结果再放进一个列表中, 即使只有一个元素也要放进列表中

import tensorflow as tf

x = [[[1,2,3],[4,5,6]],
[[7,8,9],[1,1,1]],
[[2,2,2],[3,3,3]]]

a = tf.gather(x,[0,2])

with tf.Session() as sess:
    print('a',sess.run(a))#输出123,456和222,333

五、tf 的onehot函数

参考[tf.one_hot()函数简介](https://www.jianshu.com/writer#/notebooks/17771847/notes/18446692/preview

比如,输入indices是一维列表,[1,3,5,7,9],depth等于10
那么就会输出一个shape为[5,10]的二维数组,其中第一行中的索引为1的位置为1,其余为0.第二行中索引为3的位置为1,其余值为0.

如果输入的indices是一个shape是[1,5]的二维数组,[[1,3,5,7,9]],那么输出就会使一个[1,5,10]的三维数组。其中的onehot形式是一样的。

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

推荐阅读更多精彩内容

  • TF API数学计算tf...... :math(1)刚开始先给一个运行实例。tf是基于图(Graph)的计算系统...
    MachineLP阅读 3,408评论 0 1
  • 1. tf函数 tensorflow 封装的工具类函数 | 操作组 | 操作 ||:-------------| ...
    南墙已破阅读 5,025评论 0 5
  • 妈妈母亲节快乐! 一早起来,我就开始为宝宝班的孩子们,给妈妈们一个节日的惊喜忙碌着,等到宝宝们都被妈妈接走了,才想...
    爱舞蹈阅读 321评论 2 1
  • 人生对于我们来说到底意味着什么?我觉得就是一场旅行,一个人去从来没去过的远方说不怕都是骗人的,但我们总要长大远方...
    站在城墙上等我归来阅读 238评论 0 0
  • 在《歌手》的舞台上张杰唱了《你就不要想起我》,最后自己哭了,哭的像个孩子,而我呢。我听傻了~ 本来唱的是~你就不要...
    潇潇暔阅读 327评论 0 0