tensorflow中tf.strided_slice用法

一个工程中用到,乍一看很简单,给了下标直接就能从队列中切出数据来,但是扫一眼help给的高级用法反而有点懵,所以写了个demo。

demo1:正常单轴用法,只要给出下标就能切数据

import tensorflow as tf
sess = tf.Session()
#easy demo
t = tf.constant([1,2,3,4,5,6,7,8])
t1 = tf.strided_slice(t,[1],[-1])
t2 = tf.strided_slice(t,[3],[999])#stands for -0
t3 = tf.strided_slice(t,[1],[3])
t4 = tf.strided_slice(t,[0],[-1])
#t41 = tf.strided_slice(t,[0],[-1],[0])#must be non-zero
t42 = tf.strided_slice(t,[0],[-1],[1])
t43 = tf.strided_slice(t,[0],[-1],[2])
t44 = tf.strided_slice(t,[0],[-1],[3])

t5 = tf.strided_slice(t,[3],[5])
t52 = tf.strided_slice(t,[5],[3])
t53 = tf.strided_slice(t,[5],[3],[-1])
print(sess.run(t1))
print(sess.run(t2))
print(sess.run(t3))
print(sess.run(t4))
#print(sess.run(t41))
print(sess.run(t42))
print(sess.run(t43))
print(sess.run(t44))
print(sess.run(t5))
print(sess.run(t52))
print(sess.run(t53))

[2 3 4 5 6 7]
[4 5 6 7 8]
[2 3]
[1 2 3 4 5 6 7]
[1 2 3 4 5 6 7]
[1 3 5 7]
[1 4 7]
[4 5]
[]
[6 5]

前边demo顺带加了一下strides逆序,为下边做铺垫:可以看到,逆序后,“下标”还是不变的,不会因为逆序而把原来的0当-1,把原来的-1当0,但是开闭区间变了,从左闭右开变成左开右闭。

下边包含help中给的例子,多轴且分方向,例子看起来有点迷糊,做了一下变形并扩展了一下:

#demo 2
t = tf.constant([[[11, 12, 13], [21, 22, 23]],
                 [[31, 32, 33], [41, 42, 43]],
                 [[51, 52, 53], [61, 62, 63]]])
print(t)
t1 = tf.strided_slice(input_ = t,begin = [1,0,0], end = [2,1,3], strides = [1,1,1])
print(sess.run(t1))
t2 = tf.strided_slice(t, [1, -1, 0], [2, -3, 3], [1, -1, 1])
print(sess.run(t2))
t22 = tf.strided_slice(t, [1, -1, 0], [2, -3, 2], [1, -1, 1])
print(sess.run(t22))
t23 = tf.strided_slice(t, [1, -1, 0], [1, -3, 2], [1, -1, 1])
print(sess.run(t23))
t24 = tf.strided_slice(t, [1, -1, 0], [2, -3, 3], [1, -1, 2])
print(sess.run(t24))


[[[31 32 33]]]
[[[41 42 43]
  [31 32 33]]]
[[[41 42]
  [31 32]]]
[]
[[[41 43]
  [31 33]]]

总结一下,最迷惑的点是“下标”问题,t2 = tf.strided_slice(t, [1, -1, 0], [2, -3, 3], [1, -1, 1])中,看起来好像找到一个起始点数据,找一个终点数据,直接划过去选中所有数据(感觉应该有很多数据),或者是按strides选中所有数据(感觉应该没数据),实际情况都不符,居中([31 32 33])

start和end给出的这个“下标”其实不是一个具体的下标,给的是按轴数的顺序!!!而且每个strides对应的axis能单独控制这个轴方向的移动,比如,strides=[1,-1,1],切的时候先找4x再找3x,但是内部先31再32,同样,strides大小当然也分开控制。

小窍门,根据开闭区间,按轴画线,做些“+”来标记大概范围,然后每次从strides中找一个axis,再根据“+”标,做起点终点,按这个axis的顺序选数据。

多的就不废话了,简单画一下或者跑一下例子就出来了。

猜你喜欢

转载自blog.csdn.net/huqinweI987/article/details/82917896