import tensorflow as tf
t = tf.constant([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]], [[5, 5, 5], [6, 6, 6]]])
#(3 2 3)
slicet1 = tf.slice(t, [1, 0, 0], [1, 1, 3])
slicet2 = tf.slice(t, [1, 0, 0], [1, 2, 3])
slicet3 = tf.slice(t, [1, 0, 0], [2, 1, 3])
sess=tf.Session()
print(sess.run((slicet1)))#[[[3 3 3]]]
print(sess.run((slicet2)))#[[[3 3 3]
#[4 4 4]]]
print(sess.run((slicet3)))#[[[3 3 3]]
#[[5 5 5]]]

Shape:

shape的功能是读取tensor各维度的长度,以本例中t为例,括号共有3层,即t为3维tensor,下面进行逐层分析。

只看它最外面的括号,可以看成是:

t = [A, B, C]                                 #这是第一维度

然后每一个里面有两个元素,可以写成:

A = [i, j], B = [k, l], C = [m, n]  #这是第二维度

最后,这i, j, k, l, m, n中又分别有三个元素:

i = [1, 1, 1], j = [2, 2, 2], k = [3, 3 ,3], l = [4, 4, 4], m = [5, 5, 5], n = [6, 6, 6]  # 这是第三维度

所以shape就是中括号 [ ] 的层级里单位的数量。

对于t,最外面括号里有3个元素,分别是A, B, C。这三个元素中每个里面有2个元素, i和j, k和l, m和n。

他们里面每一个又有3个数字。所以t的shape是[3,2,3]


Slice:

在解释slice之前,首先要注意python的数组index是从0开始的。

之后来看例子:

tf.slice(t, [1, 0, 0], [1, 1, 3])  # begin = [1, 0, 0]

这里根据顺序我们知道,begin是[1, 0, 0], size是[1, 1, 3].  他们两个数组的意义是从左至右,每一个数字代表一个维度。上面说了begin的意思是起始位置,那么[1, 0, 0]的意思是在3个维度中,每个维度从哪里开始算起。

第一维度是[A, B, C]。 begin里[1, 0, 0]是1,也就是从B算起。其次第二维度里B = [k, l],begin里第二个数是0,也就是从k算起。第三维度k = [3, 3 ,3],begin里第三个数是0,就是从第一个3算起。

确定这三个起始点之后,再来看size。

size的意思是每个维度的大小,也就是每个维度取几个元素。size的应该是最后输出的tensor的shape。

本例中:

t = tf.constant([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]], [[5, 5, 5], [6, 6, 6]]])

tf.slice(t, [1, 0, 0], [1, 1, 3])  # size = [1, 1, 3]

size里第一个是1,意思是在第一个维度取1个元素。t = [A, B, C] begin是起算是B,取1个那就是B。故第一维度结果就是[B]

size第二个也是1,第二维度B = [k, l], begin里起算是k,取1个是k。那么第二维度结果是[[k]]

size第三个是3,第三维度k = [3, 3 ,3],begin里起算是第一个3。取3个元素,即把三个3都取了,所以是[[[3, 3, 3]]]


例2:

t = tf.constant([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]], [[5, 5, 5], [6, 6, 6]]])

tf.slice(t, [1, 0, 0], [1, 2, 3])

这里begin还是一样[1, 0 ,0]。 size第一个维度取一个,还是[B]。然后size第二个数不是1了,是2,意为取两个。因B = [k, l],所以,是k和l都要取。第三维度取3个,即k = [3, 3 ,3],l = [4, 4, 4]都要slice走。

总结一下,第一维度取[B]。第二维度里把B换成[k, l],就变成了[[k, l]]. 第三维度里把k换成[3, 3 ,3],把l 换成 [4, 4, 4],替换后是最终结果

[[[3, 3, 3], [4, 4, 4]]]


例外:

t = tf.constant([[[1, 1, 1], [2, 2, 2]], [[3, 3, 3], [4, 4, 4]], [[5, 5, 5], [6, 6, 6]]])

tf.slice(t, [1, 0, 0], [-1, -1, -1])

对于这种情况,源代码注释中有一句话:

If `size[i]` is -1, all remaining elements in dimension i are included in the slice. In other words, this is equivalent to setting: `size[i] = input.dim_size(i) - begin[i]`

也就是说,如果size输入值是-1的话,在那个维度剩下的数都会slice走。上面的例子中,begin是[1, 0, 0]。三个维度都是-1的话,那么结果: 第一维度是[B,C];第二维度是[[k, l], [m, n]]; 第三维度是[[[3,3,3], [4,4,4]], [[5,5,5], [6,6,6]]]

expand_dims()

 #coding=utf-8
import tensorflow as tf
import numpy as np
t=[[2,3,3],
[1,5,5]]
t1=tf.expand_dims(t,0)
t2=tf.expand_dims(t,1)
t3=tf.expand_dims(t,2)
t4=tf.expand_dims(t,-1)
print(np.shape(t)) #(2, 3)
#np.shape()是读取各维度的长度
#t初始化为二维,第一维度长度为2,第二维度长度为3,即2X3两行三列的矩阵
print(np.shape(t1)) #(1, 2, 3)在0号位置插入一个维度
print(np.shape(t2)) #(2, 1, 3)在1号位置插入一个维度
print(np.shape(t3)) #(2, 3, 1)在2号位置插入一个维度
print(np.shape(t4)) #(2, 3, 1)在最后一个位置插入一个维度

本例中,原本t为2*3,即长2宽3的二维平面,tf.expand_dims完成升维,即把二维平面扩展为三维空间,即2*3*1,长2宽3高1。

tf.expand_dims(input, dim, name=None)

第1个参数input为输入张量,第2个参数为新增维度的位置。

比如原来是x*y,现在新增z,t3=tf.expand_dims(t,2)后,现态空间就变成了x*y*z,类似的,第2个参数为0时,现态空间为z*x*y

dim传的参数值起维度定位作用。

ref:

https://www.tensorflow.org/versions/r1.1/api_docs/python/tf/slice

https://www.quora.com/How-does-tf-slice-work-in-TensorFlow

https://www.jianshu.com/p/71e6ef6c121b

Shape,expand_dims,slice基本用法的更多相关文章

  1. python中index、slice与slice assignment用法

    python中index.slice与slice assignment用法 一.index与slice的定义: index用于枚举list中的元素(Indexes enumerate the elem ...

  2. slice的用法与用量

    用法:slice用于从指定值截取并返回新数组,但原数组结构不变 arrayObject.slice(start,[end]) 起始值可以为负数,-1为最后一个,end选填,但取不到end坐标的值,实际 ...

  3. Array.prototype.slice()的用法

    我们知道,Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组,除了IE下的节点集合(因为ie下的dom对象是以com对象的形式实现的,js ...

  4. javascript中 Array.prototype.slice的用法.

    首先看到 www.w3school.cn上的解释:http://www.w3school.com.cn/jsref/jsref_slice_array.asp 定义和用法 slice() 方法可从已有 ...

  5. [AS3]as3中splice和slice的用法介绍说明

    splice 删除数组一段连续的元素,返回被删除的元素数组 var arr:Array = ["a","b","c","d&quo ...

  6. JS中数组和字符串具有的方法,以及substring,substr和slice的用法与区别

     String 对象属性 属性 描述 constructor 对创建该对象的函数的引用 length 字符串的长度 prototype 允许您向对象添加属性和方法 String 对象方法 方法 描述 ...

  7. Python:numpy中shape和reshape的用法

    >>> w=np.zeros((5,6))>>> warray([[ 0.,  0.,  0.,  0.,  0.,  0.],       [ 0.,  0.,  ...

  8. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  9. 【javascript 技巧】Array.prototype.slice的妙用

    Array.prototype.slice的妙用 开门见山,关于Array 的slice的用法可以参考这里 http://www.w3school.com.cn/js/jsref_slice_arra ...

随机推荐

  1. uvm_reg_predictor——寄存器模型(十一)

    保存寄存器的值 观察DUT寄存器值的变化. //---------------------------------------------------------------------------- ...

  2. ftp错误

    ftp 550 检查是否目录,文件确定存在. 服务器列表是要设置unix列表模式.

  3. 洛谷 P2733 家的范围 Home on the Range

    题目背景 农民约翰在一片边长是N (2 <= N <= 250)英里的正方形牧场上放牧他的奶牛.(因为一些原因,他的奶牛只在正方形的牧场上吃草.)遗憾的是,他的奶牛已经毁坏一些土地.( 一 ...

  4. LibreOJ #2037. 「SHOI2015」脑洞治疗仪

    线段树区间合并问题 恶心... 屠龙宝刀点击就送 #include <cstdio> #define N 200005 struct Segment { int l,r,mid,sum,l ...

  5. 【Python图像特征的音乐序列生成】生成伴奏旋律(附部分代码)

    做了半天做的都是一些细枝末节的东西,嗨呀. 伴奏旋律是Ukulele和弦,MIDI发音乐器是Guitar.在弹唱的时候,Ukulele和弦就是伴奏. 我们以创建<成都>伴奏为例: 节奏型: ...

  6. Windows服务管理

    按键:win+R 输入:services.msc “服务和应用程序”界面选项打开 * sc命令的使用:create(创建) delete(删除)等 * service可执行文件路径的修改:win+R ...

  7. 机器学习&深度学习资料分享

    感谢:https://github.com/ty4z2008/Qix/blob/master/dl.md <Brief History of Machine Learning> 介绍:这是 ...

  8. 突然心血来潮,想写写我在java面试中遇到的事。作为一个应届生,我觉得我的情况都与大部分应届生是差不多的,希望你们能在这上面得到一些有用的

    面试过程吧,怎么说呢?从一开始接触面试到现在成功了几家,这中间我确实收获了许多,那我就从我第一次面试开始讲吧. 第一次面试是有人介绍过来的,总之还是有一位贵人相助,所以第一次面试时,面试官很好没有怎么 ...

  9. BZOJ 4423: [AMPPZ2013]Bytehattan 并查集+平面图转对偶图

    4423: [AMPPZ2013]Bytehattan Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 277  Solved: 183 [Submit ...

  10. Unity调用Windows窗口句柄,选择文件和目录

    T:2019-6-25 10:06:59 C:Scatt Kang using System; using System.Collections; using System.Collections.G ...