TensorFlow索引与切片的实现方法

索引与切片在Tensorflow中使用的频率极其高,可以用来提取部分数据。

1.索引

在 TensorFlow 中,支持基本的[𝑖][𝑗]…标准索引方式,也支持通过逗号分隔索引号的索引方式。

假设创建四张大小为3*3的彩色图片。

# 创建张量
x = tf.random.normal([4, 32, 32, 3])
# 提取出第一张图片
x[0]

<tf.Tensor: id=253, shape=(32, 32, 3), dtype=float32, numpy=
array([[[ 3.16146165e-01, 1.88969020e-02, 1.38413876e-01],
    [ 4.89341050e-01, 2.75277281e+00, 7.39786148e-01],
    [-1.25965345e+00, -2.69633114e-01, -1.16465724e+00],
    ...,

# 提取出第一张图片的第二行
x[0][1]

<tf.Tensor: id=261, shape=(32, 3), dtype=float32, numpy=
array([[ 7.4337220e-01, -1.0524833e+00, -2.6401659e-03],
    [ 5.3725803e-01, -9.5556659e-01, 4.9091709e-01],
    [-4.6934509e-01, 7.9289172e-03, -2.9179385e+00],
    [ 2.9324377e-01, 2.1451252e+00, -3.8849866e-01],
    [ 8.2027388e-01, -4.9701610e-01, -7.3374517e-02],
    ......

# 提取出第一张图片的第二行第三列的像素
x[0][1][2]

<tf.Tensor: id=273, shape=(3,), dtype=float32, numpy=array([-0.4693451 , 0.00792892, -2.9179385 ], dtype=float32)>

# 提取出第一张图片第二行第三列第二个用到(B通道)的颜色强度
x[0][1][2][2]

<tf.Tensor: id=289, shape=(), dtype=float32, numpy=-2.9179385>

当张量的维度数较高时,使用[𝑖][𝑗]. . .[𝑘]的方式书写不方便,可以采用[𝑖,𝑗, … , 𝑘]的方式索引,它们是等价的。

x[1, 9, 2] == x[1][9][2]

<tf.Tensor: id=306, shape=(3,), dtype=bool, numpy=array([ True, True, True])>

2.切片

通过𝑠𝑡𝑎𝑟𝑡: 𝑒𝑛𝑑: 𝑠𝑡𝑒𝑝切片方式可以方便地提取一段数据,其中 start 为开始读取位置的索引,end 为结束读取位置的索引(不包含 end 位),step 为读取步长。

还是以shape为[4, 32, 32, 3]的图片张量为例。

# 创建张量
x = tf.random.normal([4, 32, 32, 3])
# 读取第二张和第三张图片
x[1:3]

<tf.Tensor: id=344, shape=(2, 32, 32, 3), dtype=float32, numpy=
array([[[[-3.4415385e-01, 5.8418065e-01, 1.8238322e-01],
     [ 5.3377771e-01, 5.8201426e-01, 1.2839563e+00],
     [-1.4592046e+00, -2.3443605e-01, -2.6524603e-01],
     ...,
     [-5.0662726e-01, 6.9743747e-01, -5.8803167e-02],
     [ 1.4200432e+00, -5.0182146e-01, 5.1661726e-02],
     [ 3.5610806e-02, -2.4781477e-01, 1.8222639e-01]],

    [[ 1.3892423e+00, 1.1985755e+00, -6.4732605e-01],
     [ 8.5562867e-01, 1.2758574e+00, 1.7331127e+00],
     [ 9.7743452e-02, -5.3990984e-01, 8.3400911e-01],
     ...,

start: end: step切片方式有很多简写方式,其中 start、end、step 3 个参数可以根据需要选择性地省略,全部省略时即::,表示从最开始读取到最末尾,步长为 1,即不跳过任何元素。如 x[0,::]表示读取第 1 张图片的所有行,其中::表示在行维度上读取所有行,它等于x[0]的写法。

即x[0, ::]等价于x[0 ]。

为了更加简洁,::可以简写成为单个冒号。

x[:, 0:28:2, 0:28:2, :]

<tf.Tensor: id=344, shape=(2, 32, 32, 3), dtype=float32, numpy=
array([[[[-3.4415385e-01, 5.8418065e-01, 1.8238322e-01],
     [ 5.3377771e-01, 5.8201426e-01, 1.2839563e+00],
     [-1.4592046e+00, -2.3443605e-01, -2.6524603e-01],
     ...,

上述表示取所有图片,隔行采样,隔列采样,采集所有通道信息。相当于在图片的高宽各放缩至原来的一半。

下面是一些常见的切片方式小结:

特别地,step可以为负数。例如:step = −1时,start: end: −1表示从 start 开始,逆序读取至 end 结束(不包含 end),索引号𝑒𝑛𝑑 ≤ 𝑠𝑡𝑎𝑟𝑡。

x = tf.range(9)

# 逆序输出
x[8:0:-1]
<tf.Tensor: id=31, shape=(8,), dtype=int32, numpy=array([8, 7, 6, 5, 4, 3, 2, 1])>

# 逆序取全部元素
x[::-1]
<tf.Tensor: id=35, shape=(9,), dtype=int32, numpy=array([8, 7, 6, 5, 4, 3, 2, 1, 0])>

# 逆序间隔采样
x[::-2]
<tf.Tensor: id=39, shape=(5,), dtype=int32, numpy=array([8, 6, 4, 2, 0])>

当张量的维度数量较多时,不需要采样的维度一般用单冒号:表示采样所有元素。

x = tf.random.normal([4, 32, 32, 3])
# 提取所有图片的G通道
x[:,:,:,1]

<tf.Tensor: id=59, shape=(4, 32, 32), dtype=float32, numpy=
array([[[ 0.5700944 , 0.58056635, 2.2198782 , ..., -0.8475847 ,
     0.49761978, 0.28784937],
    [-0.22224228, 0.77950406, -0.01802959, ..., 0.55532527,
     0.6826188 , 0.50668514],
    [-2.4160695 , -0.96219736, 0.62681717, ..., 1.0348777 ,

为了避免出现像𝑥[: , : , : ,1]这样出现过多冒号的情况,可以使用⋯符号表示取多个维度上所有的数据,其中维度的数量需根据规则自动推断:当切片方式出现⋯符号时,⋯符号左边的维度将自动对齐到最左边,⋯符号右边的维度将自动对齐到最右边,此时系统再自动推断⋯符号代表的维度数量。

# 创建四张大小为32*32的彩色图片
x = tf.random.normal([4, 32, 32, 3])
# 读取第一张和第二张图片的G/B通道数据
x[0:2,...,1:]
# 读取最后两张图片
x[2,...]
# 读取所有图片的R/G通道
x[...,:2]

掌握了张量的索引与切片之后,会让我们的书写更加快捷。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 解决Tensorflow安装成功,但在导入时报错的问题

    在Mac上按照官网教程安装成功tensor flow后,但在程序中导入时,仍然报错,包括但不限于以下两个错误.对于这种错误,原因主要在于Mac内默认的python库比较老了,即便通过pip命令安装了新的包,python也会默认导入默认位置的包.这时候需要做的就是删除,有冲突的包,对于以下两个错误,就是分别时numpy和six两个包冲突了. 可以在python命令行环境下,通过numpy.version和six.version两个命令查看当前版本,如果与预期的不一致,就可以删掉. 可以通过nump

  • 浅谈Tensorflow由于版本问题出现的几种错误及解决方法

    1.AttributeError: 'module' object has no attribute 'rnn_cell' S:将tf.nn.rnn_cell替换为tf.contrib.rnn 2.TypeError: Expected int32, got list containing Tensors of type '_Message' instead. S:由于tf.concat的问题,将tf.concat(1, [conv1, conv2]) 的格式替换为tf.concat( [con

  • 基于docker安装tensorflow的完整步骤

    前言 google又一次成为大家膜拜的大神了.google大神在引导这机器学习的方向. 同时docker 也是一个非常好的工具,大大的方便了开发环境的构建,之前需要配置安装. 最近在自学机器学习,大热的Tensorflow自然不能错过,所以首先解决安装问题,为了不影响本地环境,所以本文基于Docker来安装Tensorflow,我的环境是Ubuntu16.04. 安装Docker Docker分为CE和EE,这里我们选择CE,也就是常规的社区版,首先移除本机上可能存在的旧版本. 移除旧版本 $

  • windows环境下tensorflow安装过程详解

    一.前言 本次安装tensorflow是基于Python的,安装Python的过程不做说明(既然决定按,Python肯定要先了解啊):本次教程是windows下Anaconda安装Tensorflow的过程(cpu版,显卡不支持gpu版的...) 二.安装环境 (tensorflow支持的系统是64位的,windows和linux,mac都需要64位) windows7(其实和windows版本没什么关系,我的是windows7,安装时参照的有windows10的讲解) Python3.5.2(

  • TensorFlow模型保存/载入的两种方法

    TensorFlow 模型保存/载入 我们在上线使用一个算法模型的时候,首先必须将已经训练好的模型保存下来.tensorflow保存模型的方式与sklearn不太一样,sklearn很直接,一个sklearn.externals.joblib的dump与load方法就可以保存与载入使用.而tensorflow由于有graph, operation 这些概念,保存与载入模型稍显麻烦. 一.基本方法 网上搜索tensorflow模型保存,搜到的大多是基本的方法.即 保存 定义变量 使用saver.s

  • 浅谈Tensorflow模型的保存与恢复加载

    近期做了一些反垃圾的工作,除了使用常用的规则匹配过滤等手段,也采用了一些机器学习方法进行分类预测.我们使用TensorFlow进行模型的训练,训练好的模型需要保存,预测阶段我们需要将模型进行加载还原使用,这就涉及TensorFlow模型的保存与恢复加载. 总结一下Tensorflow常用的模型保存方式. 保存checkpoint模型文件(.ckpt) 首先,TensorFlow提供了一个非常方便的api,tf.train.Saver()来保存和还原一个机器学习模型. 模型保存 使用tf.trai

  • 初探TensorFLow从文件读取图片的四种方式

    本文记录一下TensorFLow的几种图片读取方法,官方文档有较为全面的介绍. 1.使用gfile读图片,decode输出是Tensor,eval后是ndarray import matplotlib.pyplot as plt import tensorflow as tf import numpy as np print(tf.__version__) image_raw = tf.gfile.FastGFile('test/a.jpg','rb').read() #bytes img =

  • TensorFlow实现RNN循环神经网络

    RNN(recurrent neural Network)循环神经网络 主要用于自然语言处理(nature language processing,NLP) RNN主要用途是处理和预测序列数据 RNN广泛的用于 语音识别.语言模型.机器翻译 RNN的来源就是为了刻画一个序列当前的输出与之前的信息影响后面节点的输出 RNN 是包含循环的网络,允许信息的持久化. RNN会记忆之前的信息,并利用之前的信息影响后面节点的输出. RNN的隐藏层之间的节点是有相连的,隐藏层的输入不仅仅包括输入层的输出,还包

  • TensorFlow索引与切片的实现方法

    索引与切片在Tensorflow中使用的频率极其高,可以用来提取部分数据. 1.索引 在 TensorFlow 中,支持基本的[

  • Python Numpy学习之索引及切片的使用方法

    目录 1. 索引及切片 2. 高级索引 1. 索引及切片 数组中的元素可以通过索引以及切片的手段进行访问或者修改,和列表的切片操作一样. 下面直接使用代码进行实现,具体操作方式以及意义以代码注释为准: (1)通过下标以及内置函数进行索引切片 """ Author:XiaoMa date:2021/12/30 """ import numpy as np a = np.arange(10)#创建一个从0-9的一维数组 print(a) i = sl

  • numpy中索引和切片详解

    索引和切片 一维数组 一维数组很简单,基本和列表一致. 它们的区别在于数组切片是原始数组视图(这就意味着,如果做任何修改,原始都会跟着更改). 这也意味着,如果不想更改原始数组,我们需要进行显式的复制,从而得到它的副本(.copy()). import numpy as np #导入numpy arr = np.arange(10) #类似于list的range() arr Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) arr[4] #索引(注意是从

  • python字符串下标与切片及使用方法

    python 字符串下标与切片的实例代码,如下: # !/usr/bin/env python name = "ksunone" # 索引 (下标) """ 所谓"下标",就是编号,就好比超市中的存储柜的编号,通过这个编号就能找到相应的存储空间 列表与元组支持下标索引好理解,字符串实际上就是字符的数组,所以也支持下标索引. 如果想取出部分字符,那么可以通过下标的方法. k s u n o n e 1 2 3 4 5 6 "&q

  • golang 切片截取参数方法详解

    以 s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}为例 0. 建议:做slice截取时建议用两个参数,尤其是从底层数组进行切片操作时,因为这样在进行第一次append操作时,会给切片重新分配空间,这样减少切片对数组的影响. 1. 结论:s = s[low : high : max] 切片的三个参数的切片截取的意义为 low为截取的起始下标(含), high为窃取的结束下标(不含high),max为切片保留的原切片的最大下标(不含max):即新切片从老切片的low

  • NumPy索引与切片的用法示例总结

    前言 索引和切片是NumPy中最重要最常用的操作.熟练使用NumPy切片操作是数据处理和机器学习的前提,所以一定要掌握好. 参考NumPy官方文档,总结NumPy索引和切片,可以看到它们相比Python更加方便.简介和强大. 索引和切片 您可以使用与切片 Python列表相同的方法,对NumPy数组进行索引和切片. >>> data = np.array([1, 2, 3]) >>> data[1] 2 >>> data[0:2] array([1,

  • 浅析Python字符串索引、切片、格式化

    目录 1 字符串索引 1.1 循环索引字符 2 字符使用 2.1 字符串运算 3 字符串切片 3.1 切片方法 4 字符串格式化 除了数字,Python中最常见的数据类型就是字符串,无论那种编程语言,字符串无处不在.例如,从用户哪里读取字符串,并将字符串打印到屏幕显示出来. 字符串是一种数据结构,这让我们有机会学习索引和切片--用于从字符串中提取子串的方法. 1 字符串索引 在Python语法支持中,我们简单的阐述过字符串的使用,现在我们看看python程序在处理字符串时,如何对其进行索引,打印

  • python中ndarray数组的索引和切片的使用

    索引和切片相当于是对数组中内容的读(read)或者查询(inquiry).是我们获取有用信息(demanded infomation)的重要方法. 对于索引 对于1维数组:在数组名的后面用中括号[]包括索引编号,括号中填写所查询数组的编码.比如:data[1] 对于n维数组:有两种方式 第一种:用列表表示所查询数的坐标值,如data_2dim[1,0] 第二种:把多维数组看成一位数组套娃,依次取值,如data_2dim[1][0] 对于切片 对于1维数组:在数组名后加上中括号[],在括号中填写切

  • Go语言实现字符串切片赋值的方法小结

    前言 在所有编程语言中都涉及到大量的字符串操作,可见熟悉对字符串的操作是何等重要.本文通过示例详细介绍了Go语言实现字符串切片赋值的方法,感兴趣的朋友们跟着小编一起来看看吧. 1. 在for循环的range中 func StrRangeTest() { str := []string{"str1", "str2", "str3"} for i, v := range str { fmt.Println(i, v) v = "test&q

  • TensorFlow安装及jupyter notebook配置方法

    tensorflow利用anaconda在ubuntu下安装方法及jupyter notebook运行目录及远程访问配置 Ubuntu下安装Anaconda bash ~/file_path/file_name.sh 出现许可后可按Ctrl+C跳过,yes同意. 安装完成后询问是否加入path路径,亦可自行修改文件内容 关闭命令台重开 python -V 可查看是否安装成功 修改anaconda的python版本,以符合tf要求 conda install python=3.5 Anaconda

随机推荐