tf.strided_slice()

Posted Hearthougan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tf.strided_slice()相关的知识,希望对你有一定的参考价值。

# -*- coding: utf-8 -*-
"""
Created on Tue Nov  6 10:46:32 2018

@author: Abner_hg
"""
import numpy as np

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])
y = tf.strided_slice(data,[0,0,0],[2,2,2],[1,1,1])
z = tf.strided_slice(data,[0,0,0],[2,2,2],[1,2,1])

with tf.Session() as sess:
    print('x = ', sess.run(x))
    print('y = \\n', sess.run(y))
    print('z = \\n', sess.run(z))

输出:

x =  [[[1]]]
y = 
 [[[1 1]
  [2 2]]

 [[3 3]
  [4 4]]]
z = 
 [[[1 1]]

 [[3 3]]]

那么 tf.strided_slice()对data,怎么切的呢?首先看一下, tf.strided_slice()的参数。

strided_slice(
    input_,
    begin,
    end,
    strides=None,
    begin_mask=0,
    end_mask=0,
    ellipsis_mask=0,
    new_axis_mask=0,
    shrink_axis_mask=0,
    var=None,
    name=None
)

主要的参数有input、begin、end以及strides四个。其中begin、input和strides要与input的维数保持一致。begin,end和strides共同决定input的每一维是如何剪切的。注意,这里end是开区间。那么如何切片的,接下来,我将以上述x和z例子做分析。

data = 
            [#第一维
               [#第二维
                  [1, 1, 1], #第三维
                  [2, 2, 2]
               ],
              
               [
                  [3, 3, 3],
                  [4, 4, 4]
               ],
               
               [
                  [5, 5, 5], 
                  [6, 6, 6]
               ] 
            ]

1、x = tf.strided_slice(data,[0,0,0],[1,1,1])

其中input_ = data, begin = [0,0,0],end = [1,1,1],strides = None。

(1)、首先第一维是begin=0,end=1,也就是从外向内,对第一个括号取第一个元素,即:

data = 
            [#第一个括号,
               [
                  [1, 1, 1],
                  [2, 2, 2]
               ],#第一个括号的第一个元素
              
               [
                  [3, 3, 3],
                  [4, 4, 4]
               ],#第一个括号的第二个元素
               
               [
                  [5, 5, 5], 
                  [6, 6, 6]
               ] #第一个括号的第三个元素
            ]


=====>

x1 = 
            [#第一个括号,
               [
                  [1, 1, 1],
                  [2, 2, 2]
               ],#第一个括号的第一个元素
            ]

(2)、第二维是begin=0,end=1,也就是从外向内,对第二个括号取第一个元素,即:

x1 = 
            [
               [#第二个括号,
                  [1, 1, 1],#第二个括号的第一个元素
                  [2, 2, 2] #第二个括号的第二个元素
               ]
            ]

=====>

x2 = 
            [
               [#第二个括号,
                  [1, 1, 1]#第二个括号的第一个元素
               ]
            ]

(3)、第二维是begin=0,end=1,也就是从外向内,对第三个括号取第一个元素,即:

x2 = 
            [
               [
                  [1, 1, 1]#第三个括号
                #第 1  2  3个元素
               ]
            ]
=====>

x3 = 
            [
               [
                  [1]
               ]
            ]

2、z = tf.strided_slice(data,[0,0,0],[2,2,2],[1,2,1])

其中input_ = data, begin = [0,0,0],end = [2,2,2],strides = [1,2,1]。

(1)、首先第一维是begin=0,end=2,stride = 1也就是从外向内,对第一个括号取第一个第二个元素,即:

data = 
            [#第一个括号,
               [
                  [1, 1, 1],
                  [2, 2, 2]
               ],#第一个括号的第一个元素
              
               [
                  [3, 3, 3],
                  [4, 4, 4]
               ],#第一个括号的第二个元素
               
               [
                  [5, 5, 5], 
                  [6, 6, 6]
               ] #第一个括号的第三个元素
            ]


=====>

x1 = 
            [#第一个括号,
               [
                  [1, 1, 1],
                  [2, 2, 2]
               ]#第一个括号的第一个元素
              
               [
                  [3, 3, 3],
                  [4, 4, 4]
               ]#第一个括号的第二个元素
               
            ]

(2)、第二维是begin=0,end=2,stride = 2,也就是从外向内,对所有第二个括号取第一个元素,注意:end是开区间,即:

x1 = 
            [
               [#第二个括号,
                  [1, 1, 1],#第二个括号的第一个元素
                  [2, 2, 2] #第二个括号的第二个元素
               ],
              
               [
                  [3, 3, 3],#第二个括号的第一个元素
                  [4, 4, 4] #第二个括号的第二个元素
               ]
               
            ]


=====>

x2 = 
            [
               [#第二个括号,
                  [1, 1, 1] #第二个括号的第一个元素

               ],
              
               [
                  [3, 3, 3] #第二个括号的第一个元素

               ]
               
            ]

(3)、首先第三维是begin=0,end=2,stride = 1也就是从外向内,对所有第三个括号取第一个第二个元素,即:

x2 = 
            [
               [
                  [1, 1, 1] #第三个括号,
                #第 1  2  3个元素
               ],
              
               [
                  [3, 3, 3] #第三个括号,
                #第 1  2  3个元素
               ]
               
            ]

=====>

x3 = 
            [
               [#第二个括号,
                  [1, 1] #第二个括号的第一个元素
               #第 1  2 个元素
               ],
              
               [
                  [3, 3] #第二个括号的第一个元素
               #第 1  2 个元素
               ]
               
            ]

 

以上是关于tf.strided_slice()的主要内容,如果未能解决你的问题,请参考以下文章

tf.strided_slice的用法和理解

tf.strided_slice_and_tf.fill_and_tf.concat

python 循环导入再次(也就是这个设计有啥问题)

Java堆外内存的使用

输入非假,也就是真

为啥示例不编译,也就是(co-,contra-和in-)方差如何工作?