Tensorflow基础之张量操作索引与切片|维度变换|Broadcasting

一、索引与切片

1、索引

Tensorflow支持标准索引方式和逗号分隔索引号索引方式,下面以四维张量为例,

#创建有4张28*28的图片,使用随机分布模拟产生,3代表RGB通道的强度
val = tf.random.normal([4,28,28,3])
#取第一张图片的数据
val[0]
#取第一张图片的第二列
val[0][1]
#取第一张图片第二行第三列的数据
val[0][1][2]

2、切片

通过start:end:step切片方式可以方便地提取一段数据,其中start为起始索引,end为结束读取位置索引(不包含end位),step为采样步长。下面以[4,28,28,3]图片张量为例,介绍。

#读取第2,3张照片
val[1:3]

#读取第一张照片
val[0,::]
val[0]

#为更简洁,::等价于:,如下相当于将图片变为原来的一半
val[:,0:28:2,0:28:2,:] #形状为shape=(4, 14, 14, 3)
val[:,::-2,::-2]

特别地,step可以为负数,当为负数时,索引号end<=start,为逆序读取数据。

#下面以一个序列为例
x = tf.range(10)
x

#逆序由9取到1
print(x[9:0:-1])

#逆序取全部元素
print(x[::-1])

#逆序且步长为2
print(x[::-2])

 接着,为避免序列中:过多,不方便观看,如x[:,:,:,1],可以使用\cdots符号表示取多个维度上的数据,如下,

#还是以[4,28,28,3]为例,取索引为0,1且通道索引为1,2的数据
val[0:2,...,1:]

#读取最后两张照片
val[2:,...]

#读取所有样本,所有高宽的前两个通道
val[...,:2]

二、维度变换

在神经网络中,维度变换是最核心的张量操作,通过维度变换可将数据任意的切换格式,满足不同场合的运算需求。

1、增加维度

#增加维度
x = tf.random.uniform([28,28],maxval = 10,dtype = tf.int32)
print(x)

#在随后加一个维度,形状为(28,28,1)
x = tf.expand_dims(x,axis = 2)
print(x)

#再在最前面加一个维度,形状为(1,28,28,1)
x = tf.expand_dims(x,axis = 0)
print(x)

2、删除维度

#删除维度
x = tf.squeeze(x,0)
print(x) #shape=(28, 28, 1)

x = tf.squeeze(x,2)
print(x) #shape=(28, 28)

3、交换维度

#交换维度
x = tf.random.normal([2,28,28,3])
tf.transpose(x,perm = [0,3,1,2])
#交换后shape=(2, 3, 28, 28) 

4、复制数据

tf.tile(x,multiples)函数完成在指定维度上复制,multiples分别指定了每个维度上的复制倍数,对应位置为1则不复制,对应位置为2则代表新长度要变为原来长度的二倍。

# 1、创建向量b
b = tf.constant([1,2])

# 2、插入新维度
b = tf.expand_dims(b,axis = 0)
b #shape=(1, 2)

# 3、复制数据
b = tf.tile(b,multiples = [2,1])#行复制一份,列不复制
b #shape=(2, 2)

三、Broadcasting

Broadcasting成为广播机制,它是一种轻量级的张量复制手段,在逻辑上扩展张量数据的形状,只有在需要时才执行实际存储复制操作。

优点:相比于tf.tile(x,multiples),他们的结果是一样的,但Broadcasting机制节省了大量的计算资源,故在运算过程中尽可能地利用Broadcasting机制提高运算效率。

  • 17
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
PyTorch中,可以使用多种方法对张量维度进行变换。其中常用的方法有view()和squeeze()。view()方法可以用来改变张量的形状,而squeeze()方法可以去除维度中值为1的尺寸。举例如下: 1. 使用view()方法进行维度变换。view()方法会返回一个改变了形状的新张量,但张量中的元素数量必须保持不变。可以使用该方法实现维度的展平、增加或减少维度操作。 2. 使用squeeze()方法进行维度变换。squeeze()方法可以去除张量维度中值为1的尺寸,并返回一个张量。可以指定具体的维度进行去除,也可以不指定维度,即默认去除所有为1的维度。 例如,假设有一个张量a的形状为(2, 1, 2, 1, 3),使用squeeze()方法可以去除其中值为1的维度,得到一个形状为(2, 2, 3)的新张量。 在PyTorch中,还可以使用unsqueeze()方法对张量进行维度扩展。unsqueeze()方法会在指定的维度上增加一个尺寸为1的维度,并返回一个张量。 总结起来,PyTorch中的维度变换包括view()、squeeze()和unsqueeze()等方法,可以根据具体需求选择合适的方法进行张量维度变换。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [PyTorch中Tensor的维度变换实现](https://download.csdn.net/download/weixin_38698174/13988496)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Pytorch 基础维度变化](https://blog.csdn.net/zxhandroid/article/details/129192950)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值