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。