tensorflow中tf.strided_slice用法
阿新 • • 發佈:2019-01-06
一個工程中用到,乍一看很簡單,給了下標直接就能從佇列中切出資料來,但是掃一眼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的順序選資料。
多的就不廢話了,簡單畫一下或者跑一下例子就出來了。