深度学习特征变形与通道位置与深度学习常用变形函数和区别(reshape、view、einsum和matmul)


前言

一、reshape和view

reshape和view都是用来改变张量的形状(shape)的,但是reshape会改变各个维度在存储中的物理位置,而view只会改变索引。因此,view只适合对满足连续性条件(contiguous)的张量进行操作,而reshape同时还可以对不满足连续性条件的张量进行操作,具有更好的鲁棒性。在性能上,两者差不多
总结:reshape和view都是改变张量形状的函数,但reshape能改变数据的物理位置,view只会改变索引方式。reshape更好用

二、einsum和matmul

einsum和matmul都是用来进行矩阵乘法的,但是einsum可以用一种简洁的语法来描述复杂的矩阵运算,而matmul则需要遵循矩阵乘法的规则。

a = torch.rand(2,3)
b = torch.rand(3,4)
c = torch.einsum("ik,kj->ij", [a, b])
# 等价操作 torch.mm(a, b)

其中需要重点关注的是 einsum 的第一个参数 “ik,kj->ij”,该字符串(下文以 equation 表示)表示了输入和输出张量的维度。equation 中的箭头左边表示输入张量,以逗号分割每个输入张量,箭头右边则表示输出张量。表示维度的字符只能是26个英文字母 ‘a’ - ‘z’。

而 einsum 的第二个参数表示实际的输入张量列表,其数量要与 equation 中的输入数量对应。同时对应每个张量的 子 equation 的字符个数要与张量的真实维度对应,比如 “ik,kj->ij” 表示输入和输出张量都是两维的。

equation 中的字符也可以理解为索引,就是输出张量的某个位置的值,是怎么从输入张量中得到的,比如上面矩阵乘法的输出 c 的某个点 c[i, j] 的值是通过 a[i, k] 和 b[k, j] 沿着 k 这个维度做内积得到的。

三、einsum的特殊用法-转置

a = torch.randn(2,3,5,7,9)
# i = 7, j = 9
b = torch.einsum('...ij->...ji', [a])

注意:“...”省略号,用于表示用户并不关心的索引,例子中的代表只对一个高维张量的最后两维做转置
使用einsum做转置和用reshape改变形状有以下区别:

转置是一种特殊的矩阵运算,它将矩阵的行和列互换,即a[i,j]变为a[j,i]。reshape是一种改变矩阵形状的操作,它不会改变矩阵中元素的相对位置,只会改变每个维度的长度。
einsum可以用一种简洁的语法来描述转置操作,例如torch.einsum(‘ij->ji’,a)就可以实现对a的转置。reshape则需要指定新的形状,例如torch.reshape(a,(3,2))就可以将a变为3行2列的矩阵。
einsum和reshape都不会改变原始数据的存储区,只会改变头信息区的索引方式。因此,它们都是视图操作,不会产生数据拷贝。

四、深度学习特征变形与通道位置

在深度学习里,经常遇到要变化特征尺寸的情况, 比如说要将一个图片的特征数据数据(n,c,h,w)转换为二维(nch,w),如果直接用reshape,出来的结果就是错的,要先改变通道位置再变形,因为改变通道位置要将数组转置,reshape只是改变数字的排列,并不会改变位置。程序如下:

import numpy as np
import torch
d4=np.arange(24).reshape((1,2,3,4))
print(d4.shape)
d5 = torch.einsum("nchw->nhwc", [torch.tensor(d4)])
print(d4.reshape((1*4*3,2)))
print(d5.reshape((1*4*3,2)))

结果如下,可以很明显看出来不转换通道与转换后的结果不一致。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值