tf.slice详解

https://blog.csdn.net/legend_hua/article/details/803

看见一篇写的比较详细的详解过程,在此转载一下

函数:tf.slice(inputs, begin, size, name)

作用:从列表、数组、张量等对象中抽取一部分数据

begin和size是两个多维列表,他们共同决定了要抽取的数据的开始和结束位置

begin表示从inputs的哪几个维度上的哪个元素开始抽取 
size表示在inputs的各个维度上抽取的元素个数

若begin[]或size[]中出现-1,表示抽取对应维度上的所有元素
 

tf.slice函数为:

tf.slice(
    input_,
    begin,
    size,
    name=None
)

官网描述为:This operation extracts a slice of size size from a tensor input starting at the location specified by begin

翻译为:从原始输入input数据中选择以begin开始的尺度大小为size的切片,听起来有点拗口,这到底什么意思。

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])  # [[[3,3,3]]]
 

上述结果的来历:begin为[1,0,0],size为[1,1,3],为什么是三个数列表,因为原始数据维度为3。首先从起始位置开始[1,0,0],第一位1,表示从axis=0的第二个位置开始,及从[[[3,3,3],[4,4,4]]]开始,尺度[1,1,3]的第一位为1,表示axis=0选择一个尺度的数据,即begin和size第一位共同作用,得到第一步数据[[[3,3,3],[4,4,4]]];

以上述结果为基础[[[3,3,3],[4,4,4]]]

第二位0,表示从axis=1的第1个位置开始,及从[[[3,3,3]]]开始,尺度[1,1,3]的第二位为1,表示axis=1选择一个尺度的数据,即begin和size第二位共同作用,得到第二步数据[[[3,3,3]]];

以上述结果为基础[[[3,3,3]]]

第三位0,表示从axis=2的第1个位置开始,及从[[[3]]]开始,尺度[1,1,3]的第三位为3,表示axis=2选择三个尺度的数据,即begin和size第三位共同作用,得到第二步数据[[[3,3,3]]]。

程序示例
    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]]])
    sess = tf.Session()
    data = tf.slice(t, [1,0,0], [1,1,3])
    print(sess.run(data))
    data = tf.slice(t, [1, 0, 0], [2, 2, 3])
    print(sess.run(data))
 

输出结果

[[[3 3 3]]]
 
[[[3 3 3]
  [4 4 4]]
 [[5 5 5]
  [6 6 6]]]

常见用途

当把几个尺度不同的数据concat时,可以选择这个函数作为处理。比如一个尺度为4*56*56*512和4*48*48*512的数据concat时,因为尺度不一样,所以需要从第一个数据选择一部分出来和后者concat。

现在可以这样做,裁剪数据1尺度为4*48*48*512

x1_crop = tf.slice(x1, [0,4,4,0], [-1, 48, 48, -1])

第一维选择所有数,第二维和第三维选择从第4位开始的48尺度,第四维选择所有数。此时数据维度为[4*48*48*512],所以可以concat。
 

你可能感兴趣的:(tensorflow)