1. 程式人生 > >tf.strided_slice解釋

tf.strided_slice解釋

Update

tf.stride_slice(data, begin, end) tf.slice(data, begin, end) 和tf.slice的區別是slice的end索引是閉區間,stride_slice的end索引是開區間,所以一個截掉最後一列(remove the last element or column of each line)的小技巧是用stride_slice(data, [0, 0], [rows, -1]),但是如果是用slice(data, [0, 0], [rows, -1])則仍是原矩陣。

官方介紹一眼看不明白,搜尋之後看到這篇文章tf.strided_slice 例項

,但是缺乏對於stride的介紹,自己動手再寫個notebook

import tensorflow as tf
data = [[[1, 1, 1], [2, 2, 2]],
            [[3, 3, 3], [4, 4, 4]],
            [[5, 5, 5], [6, 6, 6]]]
x = tf.strided_slice(data,[0,0,0],[1,1,1])
with tf.Session() as sess:
    print(sess.run(x))

[[[1]]]

x = tf.strided_slice(data,[0,0,0],[2,2,2])
with tf.Session() as sess:
    print(sess.run(x))

[[[1 1] [2 2]]

[[3 3] [4 4]]]

從這裡可以判斷對於tf.strided_slice(data, begin, end, stride) begin和end指定了位於[begin, end)的一小塊切片。注意end中的索引是開區間。

x = tf.strided_slice(data,[0,0,0],[2,2,2],[1,1,1])
with tf.Session() as sess:
    print(sess.run(x))

[[[1 1] [2 2]]

[[3 3] [4 4]]]

當指定stride為[1,1,1]輸出和沒有指定無區別,可以判斷預設的步伐就是每個維度為1

x = tf.strided_slice(data,[0,0,0],[2,2,2],[1,2,1])
with tf.Session() as sess:
    print(sess.run(x))

[[[1 1]]

[[3 3]]]

指定第二個維度步伐為2,看到第二個維度先選取了位置為0的資料[1,1,1],[3,3,3],然後沒有繼續選取[2,2,2],[4,4,4]

x = tf.strided_slice(data,[0,0,0],[2,2,3],[-1,1,2])
with tf.Session() as sess:
    print(sess.run(x))

[]

當begin為正值,stride任意位置為負值,輸出都是空的

x = tf.strided_slice(input, [1, -1, 0], [2, -3, 3], [1, -1, 1])
with tf.Session() as sess:
    print(sess.run(x))

[[[4 4 4] [3 3 3]]]

當begin和end對應維度為負值,stride可以為負值,表示反向的步伐。首先選取第一個維度索引為1的資料[3,3,3],[4,4,4]。再在第二個維度選取索引為-1的資料[4,4,4],再根據步伐-1選取索引為-2的資料[3,3,3]。再在第三個維度選取索引為0的資料[4],[3],再選取索引為1的資料[4],[3],再選取索引為2的資料[4],[3],最後得到上面的結果。

作者:jayzhou215 連結:https://www.jianshu.com/p/a1a9e44708f6 來源:簡書 簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。