不懂锤爆我系列之TensorFlow入门学习——shape()&slice()讲解

版权声明:CopyRight:Marval-C 欢迎转载 https://blog.csdn.net/gaotianyu824/article/details/82831839

 

在网上看到了很多关于slice()讲解的同学肯定或多或少遇到过百看不懂的窘况,那下面我就来给大家用最简洁的白话讲解slice()的具体用法。

首先,我们还是使用最常见的代码例子来进行讲解

import tensorflow as tf
#下面两行是为了抛掉错误信息的提示,大家忽略即可
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'

t = tf.constant([[[1, 1, 1], [2, 2, 2]],

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

                 [[5, 5, 5], [6, 6, 6]]])

sess = tf.Session()

data = tf.slice(t, [1, 0, 0], [1, 1, 3])

print(sess.run(data))

data = tf.slice(t, [1, 0, 0], [2, 2, 3])
print(sess.run(data))

data = tf.slice(t, [1, 0, 0], [2, 1, 3])
print(sess.run(data))

想要完全理解slice()的操作内容,我们需要先了解shape()的概念。在我本人找资料的过程中找到了一篇很好的讲解shape的资料,在这里我贴一下地址。大家看过shape()的概念后再回来就可以啦~ (PS:那篇里的slice()大家就不用看了,对初学者来说写的不算太清楚)

shape()讲解推荐地址:https://www.jianshu.com/p/71e6ef6c121b

看完之后,大家清楚啦shape()的具体含义吧~  概括而言就是从最外层到最里层,一对一对的拆中括号,每拆一次,看逗号分出来了几项,那么对应的shape就是几~ 很好理解吧。

好啦 那么到了我们今天要讨论的重点,就是slice()。

我们首先以代码中的这一句为例分析:     data = tf.slice ( t , [1, 0, 0] , [1, 1, 3] )

 通过print(sess.run(data)) 打印这句话的结果为:[[[3 3 3]]]           大家是否明白结果是为什么呢(当然不懂了,懂了我讲啥2333

我们首先来看,slice()函数的定义: tf.slice( input, begin, size, name)

不难对应上面的调用看出,input便是代码开始定义的 t , 一般情况下应用我们忽略第四个参数name。 在此基础上,我们需要掌握的参数其实只有前三个,再排除第一个参数是传值进入,我们下面结合具体例子讲解begin和size的意义和应用。

这里的begin 为【1,0,0】,其实意思就是我们要设置slice切片操作的起始位置。这里的三个数字分别对应 t 的三个shape值。尤其要注意的是下标从0开始,所以1实际上代表的是第二层。这里要是没懂的话就看我下面这段哦~

上面让大家看了shape的定义,那么我们总数据 t 的shape不难得到为[3, 2, 3]。(如果这里不知道是为什么,那么先去简单看下shape哦,很容易懂的).

那么begin的【1,0,0】中的1其实对应的就是【3,2,3】中的第一个3,与此同时由于下标是从0开始,这里1的具体含义是从shape值为3的这层(第一次拆括号后的这层,一共有三项)的第二项。(同理,如果这里是0,则是第一项)。因此1代表的含义具体为:[[[3, 3, 3], [4, 4, 4]]]

begin中的第一个0代表的意思我们进行类推,就是再展开一层,对应shape中的第二个值:2。 下标为0,所以具体的内容为:[[[3, 3, 3]]]。

那么我们合理推演,第三个0代表的就是shape的第三层中的第一个内容(下标0),也就是3

我们到现在为止就推完了begin的含义。 下面给大家讲解size的具体含义

在这里,我们的size是【1,1,3】。具体的含义由我为大家道来

第一个1的含义是以begin作为初始位置,取最外层shape(也就是对应shape[3,2,3]中第一个3的那一层)的1项。在这里就是[[[3,3,3],[4,4,4]]]这一项。

第二个1的含义就是对shape=2对应的层中取第一项。在这里shape=2的层为:[[[3,3,3],[4,4,4]]] ,取第一项的结果为:[[[3,3,3]]]

第三个数字3的含义就是对在下面一层shape取前三项。 也就是对[[[3,3,3]]]取前三项,就是他本身。

所以最后输出结果为[[[3,3,3]]]。

 所以,无论是begin还是size他们的对应位置数字其实都对应着shape对应层的操作。只要分清楚shape每层的内容,再结合我的分析过程,问题迎刃而解啦~~  slice()的讲解要是还有不明白的欢迎留言哦

猜你喜欢

转载自blog.csdn.net/gaotianyu824/article/details/82831839