1. 程式人生 > >tensorflow中tf.strided_slice用法

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的順序選資料。

多的就不廢話了,簡單畫一下或者跑一下例子就出來了。