[TensorFlow系列-17]:TensorFlow基础 - 张量的索引与切片

 作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119681139


目录

第1章 张量的索引与切片

1.1 张量的维度方向

1.2 张量元素的访问:下标

1.3. 张量元素的下标切片

1.4 索引切片的表达方式:

1.5 代码演示的前置条件

第2章 在一个维度方向上的切片操作(切片间通过冒号:分割)

2.1 正向获取连续的序列(保持原先顺序):默认步长为1

2.2 正向获取非连续的序列(保持原先顺序): 步长的使用

2.3 反向获取非连续的序列(保持原先顺序): 负数步长的使用

2.4 反/逆向获取非连续的序列(保持原先顺序): 负数步长的使用

第3章 在多个维度方向上的切片操作(维度间通过逗号,分割)

第4章 对部分维度的自动推动(省略号...的使用)




第1章 张量的索引与切片

1.1 张量的维度方向

1.2 张量元素的访问:下标

张量元素的标识a[Idx-x][Idx-y][Idx-z]

其中Idx-x,Idx-y,Idx-z就是张量在不同维度方向的位置下标,代表了张量元素在整个张量空间中的位置。
 

1.3. 张量元素的下标切片

上述访问张量的方式称为下标访问,每次只能获取张量空间中的一个点。

如何访问张量空间中的多个顺序的元素呢?

这就涉及一个新的概念,张量下标索引的切片访问。

切片是针对某个维度方向下标访问的, 通过切片,一次可以访问多个顺序的元素,而不是唯一的元素。

每个维度方向上都可以进行各自独立的切片访问,最终可以得到的是分布在不同维度方向上的多个张量元素。

1.4 索引切片的表达方式:

[start : end : step]

通过三个参数和一个冒号“:”来定义切片的方式。

如下图所示:

 (1)元素的下标索引

  • 正数:正向编码,从开始第一元素开始编号,从0开始到正无穷,      0表示启第一个元素
  • 负数:反向编码,从最后一个元素开始编号,从-1开始,到负无穷,-1表示最后一个元素

(2)步长:

  • 正数:表示索引的增长方向是正向的。
  • 负数:表示索引的增长方向是逆向的。

备注:Pytorch不支持负数步长,Tensorflow支持

(3)开闭区间

  • start:是闭合区间,包含start索引的元素
  • end:是开合区间,不包含end索引的元素

1.5 代码演示的前置条件

#环境准备
import numpy as np
import tensorflow as tf
print("hello world")
print("tensorflow version:", tf.__version__)

第2章 在一个维度方向上的切片操作(切片间通过冒号:分割)

2.1 正向获取连续的序列(保持原先顺序):默认步长为1

#代码示例:

print("原张量:")
a = tf.constant([0,1,2,3,4,5,6,7,8,9])
print(a)

print("\n正向切片,正向定位:有冒号, 有起始 =>[start: end) 半闭半开区间")
#切取一段明确的、指定的、连续下标的元素序列
b = a[4]    #没有冒号,取一个正向元素:起始闭合[4] 
print(b)
b = a[6]   #没有冒号,取一个正向元素:起始闭合[6] 
print(b)

b = a[0:6]  #有冒号,取正向序列[4,6) 半闭半开区间 => 起闭:a[4]和终开:a[5] 
print(b)

输出结果:

原张量
tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)

正向切片,正向定位:有冒号, 有起始 =>[start: end) 半闭半开区间
tf.Tensor(4, shape=(), dtype=int32)
tf.Tensor(6, shape=(), dtype=int32)
tf.Tensor([0 1 2 3 4 5], shape=(6,), dtype=int32)
#代码示例2:

print("原张量:")
a = tf.constant([0,1,2,3,4,5,6,7,8,9])
print(a)

print("\n正向切片,正向定位:有冒号, 无起始,有终止 =>[: end) 半闭半开区间")
b = a[:6]  #有冒号,无起始,有终止,取正向序列:[0,6) 半开半闭区间
print(b)

输出:

原张量
tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)

切片后张量
tf.Tensor([0 1 2 3 4 5], shape=(6,), dtype=int32)
#代码示例3:

print("原张量:")
a = tf.constant([0,1,2,3,4,5,6,7,8,9])
print(a)

print("\n正向切片,正向定位:有冒号, 有起始,无终止 =>[start:) 半闭半开区间")
b = a[5:]  #有冒号,有起始,无终止,取正向序列:[5,-) 半开半闭区间
print(b)

输出:

原张量
tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)

正向切片,正向定位:有冒号, 有起始,无终止 =>[start:) 半闭半开区间
tf.Tensor([5 6 7 8 9], shape=(5,), dtype=int32)

代码示例4:

print("原张量:")
a = torch.Tensor([0,1,2,3,4,5,6,7,8,9])
print(a)

print("\n正向切片,逆向定位:有冒号, 有起始 =>[start: end) 半闭半开区间")
b = a[-1]   #没有冒号,取一个逆向元素:[10-1]
print(b)  

b = a[-2]   #没有冒号,取一个逆向元素:[10-2]
print(b)

b = a[-4:-1] #有冒号,有始有终,取[-4,-1)半开半闭区间元素序列。
print(b)

b = a[-4:] #有冒号,有始有终,取[-4,-)半开半闭区间元素序列。
print(b)
print("原张量:")
a = tf.constant([0,1,2,3,4,5,6,7,8,9])
print(a)

print("\n正向切片,正向定位:有冒号, 无起始,无终止 =>[:) 半闭半开区间")
b = a[:]  #有冒号,无起始,无终止,取正向序列:[0,-)半开半闭区间 或 [0,-1]全闭区间
print(b)

输出:

原张量
tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)

正向切片,正向定位:有冒号, 无起始,无终止 =>[:) 半闭半开区间
tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)
# 代码示例5:

print("原张量:")
a = tf.constant([0,1,2,3,4,5,6,7,8,9])
print(a)

print("\n正向切片,逆向定位:有冒号, 有起始 =>[start: end) 半闭半开区间")
b = a[-1]   #没有冒号,取一个逆向元素:[10-1]
print(b)  

b = a[-2]   #没有冒号,取一个逆向元素:[10-2]
print(b)

b = a[-4:-1] #有冒号,有始有终,取[-4,-1)半开半闭区间元素序列。
print(b)

b = a[-4:] #有冒号,有始有终,取[-4,-)半开半闭区间元素序列。
print(b)
原张量:
tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)

正向切片,逆向定位:有冒号, 有起始 =>[start: end) 半闭半开区间
tf.Tensor(9, shape=(), dtype=int32)
tf.Tensor(8, shape=(), dtype=int32)
tf.Tensor([6 7 8], shape=(3,), dtype=int32)
tf.Tensor([6 7 8 9], shape=(4,), dtype=int32)

2.2 正向获取非连续的序列(保持原先顺序): 步长的使用

#代码示例1:

print("原张量:")
a = tf.constant([0,1,2,3,4,5,6,7,8,9])
print(a)

print("\n正向切片,指定步长")
# 默认步长为1
b = a[2:8]    #无步长冒号,默认为1
print(b)
b = a[2:8:]  #有步长冒号,无步长数值,默认为1
print(b)
b = a[2:8:1] #有步长冒号,有步长数值:1
print(b)
b = a[2:8:2] #有步长冒号,有步长数值:2
print(b)
b = a[2:8:3] #有步长冒号,有步长数值:3
print(b)

输出:

原张量:
tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)

正向切片,指定步长
tf.Tensor([2 3 4 5 6 7], shape=(6,), dtype=int32)
tf.Tensor([2 3 4 5 6 7], shape=(6,), dtype=int32)
tf.Tensor([2 3 4 5 6 7], shape=(6,), dtype=int32)
tf.Tensor([2 4 6], shape=(3,), dtype=int32)
tf.Tensor([2 5], shape=(2,), dtype=int32)

#代码示例2:

print("原张量:")
a = tf.constant([0,1,2,3,4,5,6,7,8,9])
print(a)

print("\n默认区间,默认步长")
b = a[:] 
print(b)
b = a[::] 
print(b)
b = a[::1] 
print(b)

输出:

原张量:
tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)

默认区间,默认步长
tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)
tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)
tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)

2.3 反向获取非连续的序列(保持原先顺序): 负数步长的使用

# 代码示例:

print("原张量:")
a = tf.constant([0,1,2,3,4,5,6,7,8,9])
print(a)

print("\n默认区间,反向默认步长")
b = a[::1] 
print(b)
b = a[::-1] 
print(b)
输出:

原张量:
tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)

默认区间,反向默认步长
tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)
tf.Tensor([9 8 7 6 5 4 3 2 1 0], shape=(10,), dtype=int32)

2.4 反/逆向获取非连续的序列(保持原先顺序): 负数步长的使用

#代码示例:

print("原张量:")
a = tf.constant([0,1,2,3,4,5,6,7,8,9])
print(a)

print("\n逆切片,指定步长")
b = a[2:8:-1]   #逆向步长,起始索引< 终止索引, 无序列
print(b)
b = a[8:2:-1]   #逆向步长,起始索引>终止索引, 有序列
print(b)
b = a[-2:-8:-1] #逆向步长,
print(b)
b = a[-2:-8:-2] #逆向步长,
print(b)
b = a[-2:-8:-3] #逆向步长,
print(b)

输出:

原张量:
tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)

逆切片,指定步长
tf.Tensor([], shape=(0,), dtype=int32)
tf.Tensor([8 7 6 5 4 3], shape=(6,), dtype=int32)
tf.Tensor([8 7 6 5 4 3], shape=(6,), dtype=int32)
tf.Tensor([8 6 4], shape=(3,), dtype=int32)
tf.Tensor([8 5], shape=(2,), dtype=int32)

第3章 在多个维度方向上的切片操作(维度间通过逗号,分割)

#代码案例1:

print("原张量:")
a = tf.constant([[0,2,4,6,8,10],[1,3,5,7,9,11],[12,13,14,15,16,17]])
print(a)

print("\n在axis=0的方向上切片:")
b = a[0]
print(b)

b = a[2]
print(b)

输出:

原张量:
tf.Tensor(
[[ 0  2  4  6  8 10]
 [ 1  3  5  7  9 11]
 [12 13 14 15 16 17]], shape=(3, 6), dtype=int32)

在axis=0的方向上切片:
tf.Tensor([ 0  2  4  6  8 10], shape=(6,), dtype=int32)
tf.Tensor([12 13 14 15 16 17], shape=(6,), dtype=int32)

# 代码案例2:

print("原张量:")
a = tf.constant([[0,2,4,6,8,10],[1,3,5,7,9,11],[12,13,14,15,16,17]])
print(a)

print("\n在axis=0的方向上切片(一个维度方向):")
b = a[1:2]
print(b)

输出:

原张量:
tf.Tensor(
[[ 0  2  4  6  8 10]
 [ 1  3  5  7  9 11]
 [12 13 14 15 16 17]], shape=(3, 6), dtype=int32)

在axis=0的方向上切片:
tf.Tensor([[ 1  3  5  7  9 11]], shape=(1, 6), dtype=int32)

#代码案例3:

print("原张量:")
a = tf.constant([[0,2,4,6,8,10],[1,3,5,7,9,11],[12,13,14,15,16,17]])
print(a)

print("\n在axis=0和axis=1方向上切片(两个维度方向):")
b = a[1:2, 3:5]
print(b)

print("\n在axis=0和axis=1方向上切片(两个维度方向):")
b = a[1:3, 3:5]
print(b)

输出:

原张量:
tf.Tensor(
[[ 0  2  4  6  8 10]
 [ 1  3  5  7  9 11]
 [12 13 14 15 16 17]], shape=(3, 6), dtype=int32)

在axis=0和axis=1方向上切片(两个维度方向):
tf.Tensor([[7 9]], shape=(1, 2), dtype=int32)

在axis=0和axis=1方向上切片(两个维度方向):
tf.Tensor(
[[ 7  9]
 [15 16]], shape=(2, 2), dtype=int32)

第4章 对部分维度的自动推动(省略号...的使用)

#代码示例1:

print("原张量:")
a = tf.constant([[0,2,4,6,8,10],[1,3,5,7,9,11],[12,13,14,15,16,17]])
print(a)

print("\n在axis=0方向上切片,在axis=1方向省略(两个维度方向):")
b = a[1:2, ...]  # axis=0的切片为[1:2], axis=1省略,采用默认值
print(b)

print("\n在axis=0方向省略,在axis=1方向上切片(两个维度方向):")
b = a[...,1:2,]  # axis=0省略,axis=1的切片为[1:2], 采用默认值
print(b)

输出:

原张量:
tf.Tensor(
[[ 0  2  4  6  8 10]
 [ 1  3  5  7  9 11]
 [12 13 14 15 16 17]], shape=(3, 6), dtype=int32)

在axis=0方向上切片,在axis=1方向省略(两个维度方向):
tf.Tensor([[ 1  3  5  7  9 11]], shape=(1, 6), dtype=int32)

在axis=0方向省略,在axis=1方向上切片(两个维度方向):
tf.Tensor(
[[ 2]
 [ 3]
 [13]], shape=(3, 1), dtype=int32)

作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119681139

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: tensorflow cifar-10-batches-py是一个经典的深度学习数据集,被广泛用于图像分类任务的训练和评估。 该数据集是CIFAR-10数据集的Python版本,提供了10个类别的60000个32x32彩色图像。其中,50000张图像作为训练集,10000张图像作为测试集。 这个数据集是用Python编写的,并且使用了pickle库来加载和处理数据。它可以通过执行"import cifar10"来导入,并使用"cifar10.load_data()"来加载其数据。 加载数据后,可以使用TensorFlow来构建一个图像分类模型。TensorFlow是一个开源的深度学习框架,可以用于构建、训练和评估机器学习模型。 使用tensorflow cifar-10-batches-py数据集,可以进行图像分类任务的实验和研究。可以结合卷积神经网络等深度学习模型,对图像进行特征提取和分类。 在训练模型时,可以使用训练集进行权重更新和优化,然后使用测试集来评估模型的性能。 总结来说,tensorflow cifar-10-batches-py是一个常用的深度学习数据集,可以用于图像分类任务的研究和实验。它结合了TensorFlow框架,提供了加载、处理和评估数据的功能。通过使用它,可以建立一个自定义的图像分类模型,并对其进行训练和评估。 ### 回答2: tensorflow cifar-10-batches-py是一个用于在tensorflow框架中处理CIFAR-10数据集的Python脚本。CIFAR-10数据集是一个广泛应用于图像分类的数据集,包含10个不同类别的影像数据,每个类别有6000个32x32大小的彩色图像。 这个Python脚本通过提供一些函数和类来加载CIFAR-10数据集,并且将图像和标签进行预处理,以便于在训练和测试模型时使用。脚本中的函数可以帮助我们将原始的二进制数据转换成可用于训练的张量形式。 该脚本提供的函数可以将CIFAR-10数据集分为训练集和测试集,并提供了一个函数用于获取下一个训练批或测试批的图像和标签。此外,该脚本还提供了一个函数用于显示CIFAR-10数据集中的图像。 使用tensorflow cifar-10-batches-py脚本,我们可以很方便地加载和预处理CIFAR-10数据集,并用于训练和测试图像分类模型。这个脚本是使用Python编写的,可以在tensorflow环境中直接使用。 ### 回答3: TensorFlow的cifar-10-batches-py是一个用于训练和验证图像分类模型的数据集。它是基于CIFAR-10数据集的一个版本,其中包含50000张用于训练的图像和10000张用于验证的图像。 CIFAR-10数据集是一个常用的图像分类数据集,包含10个不同的类别,每个类别有大约6000张图像。这些类别包括:飞机、汽车、鸟类、猫、鹿、狗、青蛙、马、船和卡车。每个图像的大小为32x32像素,是彩色图像。 cifar-10-batches-py数据集通过Python脚本cifar10.py提供,它将数据集分为5个训练批次和1个验证批次。在训练过程中,可以使用这些批次中的图像进行训练,并根据验证数据集的结果来评估模型的性能。 这个数据集提供了一个方便的方式来测试和评估不同的图像分类算法和模型。使用TensorFlow的cifar10.py脚本可以加载这个数据集,并提供一些函数,用于解析和处理图像数据。 在使用cifar-10-batches-py数据集进行训练时,通常会将图像数据进行预处理,例如将像素值进行归一化处理,以便于模型的训练。同时,还可以使用数据增强的技术,如随机翻转、旋转或裁剪图像,以增加数据的多样性。 总的来说,TensorFlow的cifar-10-batches-py数据集是为了方便机器学习研究人员进行图像分类模型训练和验证而提供的一个常用数据集。它可以用于测试和评估不同的图像分类算法和模型的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文火冰糖的硅基工坊

你的鼓励是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值